TCP/IP协议的常见问题及知识点
TCP/IP协议簇中需要必知的一些问题,既是面试高频问题,又是程序员必备基础知识。
TCP/IP模型
TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议。
基于TCP/IP的参考模型将协议分成四个层次,它们分别是链路层、网络层、传输层和应用层。下图表示TCP/IP模型与传统OSI模型各层的对照关系。

TCP/IP协议通讯过程其实就是数据的一层一层封装和拆包过程, 封装: 用户数据在应用层加上APP首部后,丢给传输层处理后加上TCP首部传输到网络层, 网络层加上IP首部到链路层加上以太网首部和尾部.
拆包: 对方加上到发送过来的数据包,首先经过链路层处理,剥开以太网首尾部查看相关信息,道然后到达网路层,查看IP首部信息,再到传输层的TCP首部信息,最后发送给应用层,相关应用程序拿到数据.
数据链路层
数据链路层传输数据是通过MAC地址寻址后(每个适配器-其实就是网卡,都有一个唯一的MAC地址),将数据分为数据帧进行传输, 数据帧中包含了源MAC地址和目标MAC地址,发送方是如何获取对方的MAC地址的呢?通过ARP协议(后面会说)
网络层
IP协议
IP协议是核心,不管是TCP,UDP,还是IMCP,都是以IP数据格式进行传输的
IP地址
每台主机都有一个IP地址, IP地址分为三大类:
- A类 0.0.0.0~127.0.0.0 通常分配给拥有大量主机的网络
- B类 128.0.0.1~191.255.0.0 适用于结点比较多的网络。
- C类 192.168.0.0~239.255.255.0 适用于结点比较少的网络
IP协议头
TTL规定了数据包能经过多少路由,每经过一个路由TTL就会-1,当为0时,数据包就会被抛弃.
ARP协议
ARP的作用时让主机根据IP地址获取目标MAC,,当主机要发送IP数据包时,会向网络广播ARP广播,广播的内容大致就是:
“我这里有一个数据包,目标IP是xxx,你们大家伙谁是这个IP的持有者,给我回个话.”
目标主机匹配到IP后回复一个包含自己MAC地址的ARP包给广播地址.
ICMP协议
ICMP协议最流行的应用就是ping, ICMP是不可靠协议的一种,当数据包发生错误主机不可达时,ICMP会将信息传回发送主机.
Traceroute
Traceroute是用来检测源主机到目的主机之间的路由情况,
Traceroute的原理是非常的有意思,它收到到目的主机的IP后,首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给源主机。源主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给目标主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器IP。
TCP和UDP
tcp和udp最大的区别是可靠和不可靠,TCP可靠但是传输效率没有UDP高,各有所长,面向的应用也是不同的,如HTTP,FTP是TCP应用, DNS,NFS则是UDP应用.你应该知道什么时候该选谁,对网络质量有要求选TCP, 对网络质量要求不高,对传输效率要求高的选UDP.
TCP的连接与断开
握手

为什么要三次握手?
有没有想过为什么握手需要三次,两次不行吗?
第一次握手,服务端知道了客户端的发送能力,但是不知道客户端的接收能力,客户端也不了解服务端的接收能力和发送能力.
于是有了第二次握手,服务端返回数据包,客户端收到数据包后,知道了服务端的接收和发送能力都OK(要不然也不会给客户端回消息),但是还有一个问题,此时服务端还是不了解客户端的接收能力是否OK.
于是有了第三次握手,客户端回复服务端,服务端接收到回复后也确认了客户端接收了此前发送的消息,证明接收能力没问题.
挥手

为什么要等待2MSL?
MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间。
- 保证TCP协议的全双工连接能够可靠关闭 如果客户端直接CLOSED了,将会导致服务端没有收到客户端最后回复的ACK,服务端就会在超时之后继续发送FIN.
- 保证这次连接的重复数据段从网络中消失 如果客户端直接CLOSED,然后又再向服务端发起一个新连接,将不能保证这个新连接与刚关闭的连接的端口号是不同的,也就是说有可能新连接和老连接的端口号是相同的。如果这种情况发生,前一次连接的某些延迟数据在建立新连接之后才到达服务端,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样数据包就发生混淆了.