zoukankan      html  css  js  c++  java
  • TCP 首部格式

    《图解TCP/IP》 6.7  TCP的首部格式

     

    TCP中没有表示包长度和数据长度的字段。可由IP层获知TCP的包长由TCP的包长可知数据的长度。

    源端口号:表示发送端端口号,字段长16位。

    目标端口号:表示接收端端口号,字段长度16位。

    序列号:字段长32位。序列号是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接的时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

    确认应答号:确认应答号字段长度为32位。是指下一次应该收到的数据的序列号。实际上,它是指已收到确认应答号减一为止的数据。发送端接收到这个确认应答号以后可以认为在这个序列号以前的数据都已经被正常接收。

    数据偏移:该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始,当然也可以把它看做TCP首部的长度。该字段长4位,单位为4字节(32位)。

    保留:该字段主要是为了以后扩展时使用,其长度为4位,一般设置为0,但即使收到的包在该字段不为0,此包也不会被丢弃。

    控制位:字段长为8位,每一个从左到至右分别为CWR,ECE,URG,ACK,PSH、RST、SYN、FIN。这些控制标志也叫作控制位。当它们对应位上的值为1时,具体含义如

    CWR(Congestion Window Reduced):CWR标志与后面的ECE标志用于IP首部的ECN字段。ECE标志为1时,则通知对方将拥塞窗口变小。

    ECE(ECN-Echo):ECE标志表示ECN-Echo。置为1会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1。

    URG(Urgent Flag):该为为1时,表示包中有需要紧急处理的数据。对于需要紧急处理的数据,会在后面的紧急指针中再进行解释。

    ACK(Acknowledge Flag):该位为1时,确认应答的字段变为有效。TCP规则除了最初建立时的SYN包之外该为必须设置为1。

    PSH(Push Flag):该位为1时,表示需要将受到的数据立即传输给上层的应用。PSH为0时,则不需要立即上层而是先进行缓存。

    RST(Reset Flag):该位为1时表示TCP连接中出现异常必须强制断开连接。例如,一个没有被使用的端口即使发来连接请求,也无法通行。此时就可以返回一个RST设置为1的包。此外,程序宕掉或切断电源等原因导致主机重启的情况下,由于所有的连接信息将全部被初始化,所以原有的TCP通行也将不能继续进行。这种情况下,如果通信对方发送一个设置为1的RST包,就会使用心强制断开连接。

    SYN(Synchronize Flag):用于建立连接。SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。

    FIN(Finish Flag):该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。每个主机又对对方的FIN包进行确认应答以后就可以断开连接。不过,主机收到FIN设置为1的TCP端以后不必马上回复一个FIN包,而是可以等到缓冲区中所有数据都已成功发送而被自动删除之后再发。

    窗口大小:该字段为16位,用于通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小(8位字节)。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,以了解最新的窗口大小。但这个数据必须是1个字节。

    校验和:TCP的校验和与UDP相似,却别在于TCP的校验和无法关闭。TCP和UDP一样在计算校验和的时候使用TCP伪首部。这个伪首部如图:

    为了让其全长为16位的整数倍,需要在数据部分的最后填充0。首先将TCP校验和字段设置为0.然后以16位为单位进行1的补码和计算,再将它们的总和的1的补码和放入校验和字段。接收端在收到TCP数据段以后,从IP首部获取IP地址信息构造TCP伪首部,再进行校验和计算。由于校验和字段里保存着除本字段以外其他部分的和的补码值,因此如果计算校验和字段在内的所有数据的16位和以后,得出的结果是“16位全部为1 ”,说明收到的数据是正确的。

    紧急指针:该字段长为16位。只有在URG控制位为1时有效。该字段的数值表示本报文中国紧急数据的指针。正确来讲,从数据部分的首位到紧急指针所指示的位置为止为紧急数据。因此也可以说紧急指针指出了紧急数据的末尾在报文段中的位置。如何处理紧急数据属于应用的问题。一般在暂时中断通信,或中断通信的情况下使用。例如在Web浏览器中点击停止按钮,或者使用TELNET输入Ctrl+C时都会有URG为1的包。此外,紧急指针也用左表示数据流分段的标志。

    选项:选项字段用于提高TCP的传输性能。因为根据数据偏移(首部长度)进行控制,所以其长度最大为40字节。另外,选项字段尽量调整其为32位的整数倍。具有代表性的选项部分:

    类型2的MSS选项用于在建立连接时决定最大段长度的情况。这选项用于大部分操作系统。

    类型3的窗口扩大,是一个用来改善TCP吞吐量的选项。TCP首部中窗口字段只有16位。因此在TCP包的往返时间(RTT)内,只能发送最大64K字节的数据。如果采用了该选项,窗口的最大值可以扩展到1G字节。因此,即使在一个RTT较长的网络环境中,也能达到较高的吞吐量。

  • 相关阅读:
    HTML5
    带参数
    类的无参方法
    类和对象
    Java新帮派——数组
    神竜出击 合三为一!
    校园欺凌——四位学生的乱伦之战!!!
    GC常见算法
    jstat
    SpringBoot2
  • 原文地址:https://www.cnblogs.com/alway-july/p/9100351.html
Copyright © 2011-2022 走看看