LEEDOM

Mar 01, 2022

网络知识学习笔记-TCP协议

TCP首部有20字节,其组成如上图,

  • 源端口和目标端口;
  • 序列号:在SYN报文中,客户端和服务端会发送自己的ISN(Initial Sequence Number,初始化序列号),然后在自己回复的报文中将ACK设置为ISN+1;之后每次的ACK都是在对方的Seq的基础上加传输的len,而同一端每次发送的Seq则是在上一次的Seq号基础上加上传输的大小,这样每次的ACK都能对上;
  • 确认号:用来告知对方下一次期望收到的序列号,小于这个的值代表都已经收到了;需要注意的是确认是可以延迟的,也就是收到好几个包之后一次性进行确认;
  • 标志位:这里是每次报文的一些标志位
    • SYN(Synchroize):用于建立连接时,交互初始序列号;
    • ACK(Acknowledge):确认号;
    • RST(Reset):强制断开连接;
    • FIN(Finish):断开连接时的标志位;
    • PSH(Push):告知对方该数据需要立刻交给上层处理,不能缓存;
  • 窗口大小:最开始的设计只有2的16次方的值,也就是65535的大小,现在已经无法满足,所以追加了窗口缩放因子进行缩放;
  • 可选项:这里面就是填入窗口缩放因子的地方(Window Scale),还有MSS(Maximum Segment Size, 最大报文段)等信息;

握手、传输、挥手实例

客户端以ISN=2000发起TCP连接,服务端以ISN=3000打开连接,经过握手后,客户端发送20字节数据给服务端,服务端回复30字节数据给客户端,之后断开连接

其传输过程如下

  • Client->Seq=2000, ack=0, SYN->Server;
  • Server->Seq=3000,ack=2001,SYN,ACK->Client;
  • Client->Seq=2001,ack=3001,ACK->Server;
  • Client->Seq=2001,ack=3001,len=20,ACK->Server;
  • Server->Seq=3001,ack=2021,len=10,ACK->Client;
  • Client->Seq=2021,ack=3011,FIN,ACK->Server;
  • Server->Seq=3011,ack=2022,ACK->Client;
  • Server->Seq=3011,ack=2022,FIN,ACK->Client;
  • Client->Seq=2022,ack=3012,ACK->Server;

三次握手可以两次么

之所以需要三次来确定链接的建立,是因为网络的情况特别复杂,仅使用两个握手的话,其中一个到达的时间超过了重发的时间,就会导致一端重发,但是如果这个超时的握手最后还到达了,就会建立一条无效的连接,这个过程不如使用三次握手来的更加直接。

同理,因为TCP是双工的,在四次挥手时,如果不进行四次的挥手,就会导致一端在发出断开连接的同时,无法再次接受到另一端继续发送的数据了。所以四次挥手的意义在于双方都确定不再发送数据都可以断开的情况下,才断开连接。

发送窗口和接受窗口的关系

在互相发送的数据包中,其window size的值表示的是接受窗口,这是在向对方声明自己的接受窗口的大小值,从而让发送端调整发送接口。

window的计算

主要是存在window scale的情况下,其值为window=window scale * 2^(shift count),这些值都在头部的Option中。

慢启动和拥塞避免

仅仅提下概念,大概就是在连接开始时,由于对网络的情况不太清楚,一种保守起见的做法就是慢启动,具体就是在连接开始时把拥塞窗口的起始值设置的比较低,然后按倍增加其大小,所以是一种基数低,增速快的形式。

当慢启动一段时间后,由于增速快,所以达到的拥塞窗口的值也会变得比较大,就很容易触发到拥塞点,这个时候就需要降低增速,将方案从慢启动的按倍增加调整为逐个增加,这个过程就是拥塞避免。

通信优化

OLDER > < NEWER