【lwip】12-一文解决TCP原理( 二 )


对于每个发送出去的报文 , TCP也不会马上删除他们,而是将他们保存在缓冲区中,以便超时时重传 , 收到ACK时才删除 。
接收缓冲:
报文到达时,可能是乱序的 , 也可能因为应用层来不及处理,需要缓存起来,这些数据就能先保存到接收缓冲区 。
12.3.5 拥塞控制如果一个主机还是以很大的流量给另一个主机发送数据 , 但是其中间的路由器通道很小,无法承受这样大的数据流量的时候,就会导致拥塞的发生 , 而拥塞控制考虑的就是网络的传输状况 。
通常在路由器发送拥塞时,它会丢弃掉不能处理的数据报,这将导致发送方因接收不到确认而重传 , 重传的数据同样不会成功,且重传会使得路由器中拥塞更为严重 。
拥塞发生时报文被丢弃 , 但是发送方不会得到任何报文丢失的信息,因此,发送方必须实现一种自适应机制,及时检测网络中的拥塞状况,自动调节数据的发送速度 , 这样才能提高数据发送的成功率 。
在TCP中,引进了一个名为拥塞窗口的概念,与滑动窗口相似,拥塞窗口也是发送方控制数据发送速度的方式之一 。
12.3.6 基于字节流tcp是面向字节流的,数据间没有明显的间隔 。
12.3.7 其它机制糊涂窗口避免、零窗口探查、连接保活等 。
12.4 TCP报文12.4.1 TCP报文段封装

【lwip】12-一文解决TCP原理

文章插图
12.4.2 TCP报文段格式
【lwip】12-一文解决TCP原理

文章插图
  • 端口号 :每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程 。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接 。
    • socket :包含客户 IP 地址、客户端口号、服务器 IP 地址和服务器端口号的四元组 。
  • 序号 :用于对字节流进行编号 。
    • 例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401 。
  • 确认号 :期望收到的下一个报文段的序号 。
    • 例如B正确收到A发送来的一个报文段 , 序号为 501,携带的数据长度为 200 字节,因此B期望下一个报文段的序号为 701,B发送给A的确认报文段中确认号就为 701 。
  • 数据偏移 :指的是数据部分距离报文段起始处的偏移量 , 实际上指的是首部的长度 。单位:字 。
  • URG :紧急(The urgent pointer) 标志置位 。只有当 URG 标志置1时紧急指针才有效 。
  • ACK :确认标志 。当 ACK=1 时确认号字段有效,否则无效 。
    • TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1 。
  • PSH :推标志 。该标志置位时 , 接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理 。
    • 在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的 。
  • RST :复位标志 。复位标志有效,重建连接 。
  • SYN :同步标志 。同步序列编号(Synchronize Sequence Numbers)栏有效 。
    • 在连接建立时用来同步序号 。当 SYN=1,ACK=0 时表示这是一个连接请求报文段 。若对方同意建立连接,则响应报文中 SYN=1,ACK=1 。
  • FIN :结束标志 。用来释放一个连接,当 FIN=1 时 , 表示此报文段的发送方的数据已发送完毕,并要求释放运输连接 。
  • 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据 。流量控制 。
  • 校验和 :检验和覆盖了整个的TCP报文段:TCP首部(包括伪首部)和TCP数据 。这是一个强制性的字段,一定是由发端计算和存储 , 并由收端进行验证 。
  • 紧急指针 :紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号 。
    • TCP的紧急方式是发送端向另一端发送紧急数据的一种方式 。
    • 只有当 URG 标志置1时紧急指针才有效 。
  • 选项 :长度可变,最长可达40字节 。当没有使用“选项”时 , TCP的首部长度是20字节 。选项字段长度需要为4字节的整数倍,不够的需要进行填充来模组4字节整数倍 。
12.4.3 TCP伪首部TCP校验和的计算包括了三部分:TCP伪首部+TCP首部+TCP数据区 。
TCP伪首部包含IP首部一些字段 。其目的是让TCP验证数据是否已经正确到达目的地 。

推荐阅读