阅读 122

TCP/IP的秘密 (1) TCP协议要点

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

最近在重读TCP/IP协议,果然,每一次读都有不同的体会。TCP/IP是互联网的基础,是互联网协议栈中承上启下的中枢。

image.png

1. 协议栈:

  • 互联网使用的是基于TCP/IP的四层架构,TCP位于传输层用于建立端到端的连接,IP位于网络层用于寻址和路由。

1. 连接层级:

  • TCP是建立在两个端口(port)之间的连接,在TCP header中只有端口号。端口可以理解为计算机的独立信道,每个应用程序都使用不同的端口发送数据,并监听指定的端口。发送方需要知道在接收方一直监听指定端口,否则就会无响应或报错。

  • IP是建立在两个网络地址间的连接,在它的报文中,会再加上IP地址。

  • 两者合在一起才构成了完整的通道。

image.png

3. 数据格式:

  • TCP会把应用数据分割成最适合发送的大小,并加上TCP header,这些数据在TCP层叫做“段”segment;

  • IP会把这些段加上自己的header,作为数据包Packet发送;

  • 而再下一层的接口层,则再加上header,并转化为二进制帧frame来发送;

image.png

4. 面向连接和无连接:

  • TCP是面向连接的,什么意思?就是再双方交换数据之前必须先使用TCP建立一个固定的专属信道,所有TCP层数据都使用专有信道进行传输,即便没有数据传输,只要双方不拆链,这个通道就一直存在。可以理解为双方在“打电话”;

  • IP是无连接的,什么意思?就是双方在通信之前不需要建立固定的专属信道,使用的是类似“短信”的形式,有数据了就发送,使用的是共享的公用传输,而且每个数据包走的路径都不一定相同;

image.png

5. 可靠与不可靠

  • TCP通过ACK和checksum来确保收到的数据是完整的,正确的,TCP会负责将乱序的数据按照原本的顺序进行组合;如果发生超时,丢包等情况,会触发TCP重传,拥塞控制机制;

  • IP协议不支持拥塞控制,ACK确认机制,和纠错功能,且每个数据包都是独立的,乱序的,IP寻址和路由是BE业务,best effort即尽力而为,无法保证一定能将数据包正确完整的送到目的地,这需要TCP来实现;

6. 全双工?半双工?单工?

  • 全双工的定义Full Duplex,是指允许数据在两个方向上同时传输,也就是通信双方可以同时向对方发送数据;

  • 所谓半双工,就是同一时间,只能一方发送信息,等一方发送完毕后,另一方再发送;单工指的是只允许由发送方向接收方发消息,不允许反向;

  • 显然,TCP连接是允许双方同时向对方发送数据的,TCP是全双工;所以这也是为什么在拆链的时候,需要4次握手,确认双方都没有数据要发送了才能拆链;

7. 拆链后为什么需要等待2MSL?

  • MSL:maximum segment lifetime最大数据段生命周期,它是是TCP数据段被丢弃前在网络内的最长时间;

  • 它是确保发送的FIN ACK没有被丢弃(1 MSL),而且对方返回的re-FIN也能被收到(1 MSL);

  • 另一方面,也是为两次TCP连接之间保证足够的间隔,防止旧会话的数据影响到新会话;

8. TCP报文关键字段

image.png

  • header length: 4bit,取值范围5-15,默认是5。对应的header长度是5*32bit=160bit,到15*32bit=480bit,这里的32bit指的是每行32bit;

  • Sequence number指的是TCP段中的字节编号,TCP为payload中每个字节都由编号,这里的SEQ就是这个segment第一个byte的编号。

  • Seq的作用第一个是通过序号重新恢复接收数据正确的顺序;第二个是检验是否有丢包,以及丢的是哪个byte。

  • Seq号码每条消息都有,而ACK号码只有在ACK的flag=1时才有。

  • 发送方的ACK号码是它期望的下一个收到的TCP报文的SEQ号码。

  • 而下一个收到的TCP报文的ACK号码是它自己的SEQ+payload的字节长度。如下图:ACK=374=next SEQ; SEQ+LEN=340+387=727=next ACK

image.png

9. 滑动窗口

  • 滑动窗口的目的是,在保证不超过接收方缓存容量的前提下,尽可能的提升数传效率。窗口大小指的是不需要等待确认应答包而可以继续发送数据包的总量;

  • 发送方和接收方各自维护一个发送窗口和接收窗口

  • 通过TCP报文中的window字段将自己的接收窗口大小发给对方,单位是byte,这个字节只有16bit,所以还使用了Window size scaling factor来进行扩容,实际的window size是这两个数值的乘积,window size scaling factor是在3次握手时确定的,当值为-1表示unknown,此时的window size不可信。

image.png

  • 接收窗口(rwnd): receive window,预防应用程序发送的数据超过对方的缓冲区,接收方使用的流量控制。拥塞控制窗口(cwnd):congestion window,预防应用程序发送的数据超过了网络所能承载的能力。发送方使用的流量控制。发送窗口:就是指这两者的较小值。

  • 发送和接收窗口都是在系统的缓存中进行滑动,如果缓存被占满,则窗口会一直减小到0.

  • 一组数据被分割成不同的segment进行传输,会在接收端进行组装;

  • 重传机制:如果超出了接收端的窗口大小,则会造成部分segment无法ack,会触发该segment及它之后的segment重传。如果发生丢包,当在前面还有segment未收到,但是收到了后面segment的情况下,接收窗口不会移动,也不对后续段进行确认,以此确保发送方会对这个segment重传。

感谢阅读,如有不准确和错误之处请留言指正,我会立即修正,感谢!




总结不易,请勿私自转载,否则别怪老大爷不客气

欢迎喜欢技术的小伙伴和我交流,微信1296386616

参考资料:

《The OSI and TCP/IP models》 communicationstechnologyblog.wordpress.com/2nd-child-p…

《Why TIME_WAIT state need to be 2MSL long?》 Alex Wu stackoverflow.com/questions/2…

《Transmission Control Protocol》 Wikipedia en.wikipedia.org/wiki/Transm…

《How Does the Internet Work?》 Rus Shuler web.stanford.edu/class/msand…

《TCP/IP networking in a nutshell》 Kevin Cleary ubnetdef.org/slides/fall…

《TCP-IP详解:滑动窗口(Sliding Window)》 CQ小子 blog.csdn.net/wdscq1234/a…

文章分类
后端
文章标签