网络相关的Linux命令
cd /proc/$$/
cd fd
exec 7<> /dev/tcp/www.baidu.com/80
echo -e "GET / HTTP/1.0\n" 1>& 7
cat 0<& 7
exec 7>& -
通过上面6条指令,我们可以不借助浏览器就能向百度请求到首页。
传输控制层
传输控制层只负责双方的通信,通过“确认机制”来实现逻辑上的可靠连接,并不是真正的连接,双方都需要确认对方收到了数据。主要有TCP和UDP。 三次握手 建立socket连接,双方每次接受到对方的包时,都会向对方发送一个确认包ACK用于告诉对方已成功接受到包。 (1)Client向Server发送一个同步序列号seq1; (2)Server收到之后发送一个ACK=seq1+1响应信号,并同时发送一个自己的同步序列号seq2给客户端,但是Server并不知道对方能否正确接受; (3)Client收到之后,需要向Server发送一个ACK=seq2+1信号。这三个步骤必须都完成了 ,一个可靠的连接才建立。
四次分手 (1)Client发送FIN分手信号给Server (2)Server只要收到了数据包,就回一个ACK;此时Server可能并不能马上断开连接,他可能还有数据为发送完毕,当他发送完毕之后,向Client发送一个FIN信号。 (3)Client接收到对方发来的FIN信号,会反馈一个ACK信号。此时双发才可以释放连接(主要是客户端释放主机的端口资源)
网络层
传输控制层只负责保证可靠的连接,但是具体的数据传输到哪台机器,需要交给网络层来处理,网络层负责两件事:
- 路由判定(路由表)。判定目标地址是在当前局域网还其他网络里面。这就要依赖于IP协议。一个IP地址包含了两部分信息:网络号+主机号
- 将数据转交给下一跳。下一跳可能是该局域网内的交换机也有可能是该网络的网关设备,取决于目标IP地址是否在当前网络内。
具体做法:在路由表中,将目标IP地址于路由表中的每个条目的子网掩码做与运算,算出来的目标则可以判定是在网关还是当前局域网的交换机。 route指令
数据链路层
网络层通过路由表可以知道将数据包交给下一个节点,但是具体怎么做?光靠网络层是解决不了的,我们来假设这么一个场景:我们要发送一个数据包给百度服务器,我们通过网络层的路由表已经知道需要将该数据包交给当前网络的网关,然而这个数据包的目标地址是填百度服务器的IP地址还是网关的IP地址呢?如果填网关的IP地址,我们虽然能找到该网关,但是转交给网关之后,网关又怎么来确定他的下一个节点呢?那如果填目标的IP地址,我们根本无法找到网关,也就不可能抵达百度服务器了。这个时候就需要数据链路层了。也就说,我们即需要目标的IP地址,同时需要知道网关的IP地址,此时数据链路层的ARP协议能根据IP找到MAC地址,而MAC地址也是独一无二的
- MAC地址。网络节点的物理地址,全球独一无二。
- ARP协议。实际上也是一张表,IP:MAC表,该设备的MAC地址映射了一个IP地址。因为外面要封装一个MAC地址,如果没有MAC地址,需要ARP请求获取到该网关IP对应的MAC。
其工作原理就是:由于我们在网络层已经知道了数据包需要发给网关,这个网关的IP地址已经知道,此时,查询arp表,就能根据这个网关IP地址找到相应的MAC地址,在数据包的再套一层mac地址。
|