• TCP首部


    TCP的数据被封装在一个IP数据报中:


    TCP首部例如以下图所看到的:


    以下以此解说这些字段的含义。

    16位源port号、16位目的port号。用于寻找发送端和接收端应用进程。一个IP地址(IP首部)加一个port号(TCP首部)称为一个套接字。一对套接字可唯一确定一个TCP连接。

    32位序号。

    用来标识数据字节流中的字节,它的值表示该报文段中第一个数据字节的序号。当建立TCP连接时,发送主机选择一个初始序号ISN作为该字段的基准值。如果该值为x。那么发送SYN标识时的序号字段就为x。

    当建立连接后,发送数据的第一个字节的序号为x+1。

    也就是说发送SYN标识消耗了一个序号。


    32位确认序号。表示接收端希望下一次接受到的序号。该字段必须在ACK标志为1时(连接建立后。ACK标识总是为1)才有效。


    TCP能够表述为一个没有选择确认或否认的滑动窗体协议,什么意思呢,以下逐一解释:
    • 没有选择确认:当接收端成功收到序号为1-1024字节的数据后。发送一个确认序号为1025的ACK,期待下一次收到1025開始的数据。但如果下一次实际收到的却是2049-3072,那么接收端不正确这个报文段进行确认,而是继续发送确认序号为1025的ACK。也就是说,接收端必须按序确认,无法跳跃式的确认。
    • 无法对一个报文段否认:还是上述样例,如果接收端收到了1025-2048字节的报文段,但校验出错,那么接收端仅仅能继续发送确认序号为1025的ACK。而不能告诉发送方其他出错信息。

    4位首部长度。

    表示首部中32bit字的数目,假设首部为20字节(选项字段为空的情况下),该字段的值就为5。看了这么多的协议。能够得出规律:凡是长度可变的数据包中一般都包括长度字段。


    6位标志比特:
    • URG:紧急指针有效
    • ACK:确认序号有效
    • PSH:接收方应该尽快将这个报文段交给应用层
    • RST:重建连接
    • SYN:用来发起一个连接
    • FIN:完毕发送任务
    16位窗体大小。它的值表示用于TCP流量控制的窗体大小。

    以后会具体说明。


    16位检验和。强制性字段。

    16位紧急指针。仅仅有URG标志置1时才有效,暂不讨论。

    选项字段。最常见的选项字段是最长报文大小MSS,通常在建立连接时的SYN中设置这个选项,指明本端所能接收的最大长度的报文段。

    最后的TCP数据部分是可选的。比如,在建立和断开连接的时候两方仅仅传送了TCP首部。

    參考:
    《TCP/IP具体解释》 P170-P173.
  • 相关阅读:
    Flash代码执行原理与性能优化笔记
    服务器自建git
    列表删除
    mysql的隔离级别实践
    py2和py3的字符编码
    Django外键(ForeignKey)操作以及related_name的作用
    python多个装饰器嵌套
    git diff使用
    .gitignore 只包含几个文件
    三层菜单字典练习
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6898570.html
Copyright © 2020-2023  润新知