欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP报文格式详解

程序员文章站 2022-07-10 15:25:44
...

TCP协议 传输控制协议

TCP的特点:

  • 面向连接: 使用TCP协议进行通信时,需要先建立连接
  • 可靠传输: 具有确认应答机制,超时重传等机制保证数据的可靠传输
  • 面向字节流的: 传输的数据是面向字节流的,没有长度的限制
关于连接的概念
  • 在内核中有有一个结构体来描述连接TCB,再通过队列将其管理起来
  • 操作系统维护一个链接是需要成本的包括时间成本和空间资源成本
  • 必须要使用合理的方式管理连接否则会导致服务器挂掉
  • 连接数量是有的上限的

TCP协议的格式

0                      15 16                          31
--------------------------------------------------------  
    16位源端口号         |        16位目的端口号                   
--------------------------------------------------------     
                      32位序号                               
--------------------------------------------------------    
                    32位确认序号                            
--------------------------------------------------------    
4位首部长度|保留6位|    控制位             |16位窗口大小
--------------------------------------------------------    
         16位校验和      |        16位紧急指针              
--------------------------------------------------------  
                    选项(长度可变)             | 填充
--------------------------------------------------------
                       数据
--------------------------------------------------------

  • 16位源端口号:表示发送端端口号
  • 16位目的端口号:表示接收端端口号
  • 32位序号:***是指发送数据的位置,每发送一次数据,就累加一次该数据的字节数的大下。
    ***不会从0或者1开始,而是在连接时随机生成的,通过SYN包发送给客户端。然后再将每转发过去的字节数累加到初始值上表示数据的位置,每一个字节都有一个***。建立连接和断开连接时所发送的SYN和FIN并不携带数据,但也会增加一个字节作作为***。
  • 32位确认序号:是指下一次应该收到的数据的***。接收端收到确认应答后就表明这个***以前的数据已经被正常接收
  • 4位TCP首部长度:该长度为4位,单位为字节。表示首部的长度,但不包括选项字段。TCP的首部的默认长度为20个字节,偏移量为5(1010),最大为60个字节,偏移量为 1111 * 4
  • 保留位:该字段是为了保留为以后使用,一般设置为0 ,但即使收到的报文中该字段不为0,也不丢弃
  • 6位标志位:
UGR: URG为1时,表明该包中有需要紧急处理的数据
ACK: 确认应答是否有效,为1为有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走;PSH为1时就是将缓冲区中的数据交给上层协议。PSH为0时,就是数据不需要立即传先进行缓存
RST: RST为1,表示连接出现异常必须重更新连接,会将连接断开重新连接
SYN: 用于建立连接,为1表示希望重新建立连接
FIN: FIN为1时,表明之后不再会有数据发送了要断开连接,本端要关闭了,FIN标识为结束报文段
  • 16位窗口大小:
在发送数据时,如果发送的数据量过大,或发送数据的速度路过快,导致接收端来不及接收,会导致数据的丢失,所以接收端会和发送端协调,使其发送的数据能够
来的及被处理。而接收端所通知发送端的信息,就是窗口的大小,一般这个大小指的是 **接收端缓冲区的剩余容量的大小**。
发送端根据所收到的窗口的大小,调整自己滑动窗口的大小,进行数据的发送。如果滑动窗口的大小为零时,会发送给窗口探测了解最新窗口的大小(一个字节)
  • 16位校验和:
- TCP 与 UDP 的校验和相似,只是TCP的校验和无法关闭,两者校验时都要使用伪首部,都是对伪首部+首部+数据进行校验
-  基本过程和TCP检验和相同,不同的是UDP的伪首部中8位传输层协议号是17而TCP是6。
伪首部:
- 在实际的传输过程中并不实际存在
- 接收端在收到TCP的数据段后,会从IP首部获取IP地址信息构造TCP的伪首部,再进行校验和计算。
------------------------------------
               32位源IP地址
------------------------------------
              32位目的IP地址
------------------------------------
 填充0 |    8位协议号6 | 16位TCP包长度
------------------------------------

伪首部的作用:仅在校验时使用
- 通过目的IP地址检验主机是否收错了报文
- 通过检验协议号查看是否交付给了正确的上层协议

IP首部可以检测IP地址为何还要在伪首部进行检测:
当IP数据包在路由器中间进行转发时,可能会被修改IP首部和其中的校验和,IP的首部可能会发生变动,所以需要进行二次检测,如果接收端校验和与发送端校验和所得出的结果不一致就会被丢弃

检验方式:
- 先将校验和字段设置位0
- 以16位为单位进行1的补码运算
- 将他们总和1的补码放入到校验和字段
  • 16位紧急地址:当URG为1时有效,紧急指针所指的位置时数据的开始部分到紧急指针所指的位置位置,紧急指针指向了紧急数据的结尾部分。优势紧急指针也做分段使用。 当使用web浏览器时,如果按下停止按钮,或着是在telnet服务下按下ctrl+c就会发送URG=1
  • 40字节头部选项:选项字段用于提升TCP的创数性能
选项字段
---------------------------------------
kind类型1字节|length长度1字节|选项信息 
---------------------------------------
- 最大为40字节
有多个类型选型:
- 类型kind = 0:NOF选项表结束选项,表明首部已经没有更多消息了,数据从下一个32位开始,每个报文段只用一次,放在末尾用于填充

- 类型kind = 1:NOP空操作选项,一般用于将TCP选项的总长度填充为4字节的整数倍

- 类型2 Maximum Segment Size 4字节 MSS :每一个TCP报文数据段的最大长度,建立连接时为保证数据IP数据包不被分片,由双方协商而来的传输数据的最大长度,不能太大或太小,太小时,对于20字节的
TCP与20字节的IP首部来说是一种浪费。太大会导致IP数据段过长可能会被分片,分片会增加开销.在三次握手在中每一方都会通告其期望的MSS长度,如果不同意会被默认设置为536字节

- 类型3:窗口扩大选项3字节,在TCP中窗口的大小位16位最大位64kb. 通过扩大窗口来增加TCP的量。3个字节中的一位表移位
值S,新的窗口的值大小为(16+S),相当于把窗口值左移S位,移位值的上限为14,所以可以扩大的窗口的大小为65535*2^14即为1GB
窗口大小在连接的建立时就确定,连接后无法改变,如果已经实现了窗口的扩大,发送S=0就可以恢复到16为的大小

- 类型4 :选择性的确认应答;TCP通信时,如果数据丢失,发送端会重发最后被确认序号后序的所有报文端,但这样会重复发送。使用选择性确认选项可以只发送丢失的数据,而不用重发所有未被确认的。在初始化连接时,可以选择是否选择SACK技术。

- 类型5 :SACK的实际选项 该选项参数告诉发送方本端已经收到并缓存了的数据块(已经接收的),可以使发送端并据此进行重发丢失的
数据块,每个块边沿参数包含了一个4字节的序号。每组参数表示一个一收到的数据块的序号。左边沿块的参数为所受到数据的第一个序号,右边沿块的参数为该数
据块的结尾序号的下一个序号。这样就可以根据收到的数据块的边沿序号,确认怕丢失的数据块。看连续的序号中缺少了哪几部分。 
由于选项的字段的最大的长度为40字节,所以最可以有4组(前面有几个字节被占用)。

- 类型8: 时间戳选项,当网络在传输大量的数据时,32位的序号很快就会用完此时就会用完,序号就会重新开始,但当网络阻塞,或延迟较高时,就会造成新老序
号在同一个网络中,就会造成混淆,所以就使用时间戳来进行区分