• 网络基础 -(2)TCP/IP报文格式&状态


    TCP基础

    TCP 报文格式

    image-20200307172541565

    • Source port(源端口): 16位;

    • Destination portal(目的端口):16位;

    • Sequence number(序号):32位;

    • Acknowledgment number(确认号):32位;

    • Data offset(数据偏移量):4位。

      TCP报文段的首部长度,单位是word(4字节)。字面含义是:TCP报文段的数据的起始处,距离TCP报文段的起始处 的偏移量。4个字节最大能表示的数字是15,所以首部最大60字节。

    • Reserved(保留字段):3位。

    • Control bits(控制位):9位。

      一共9个标志位。

      标记位 说明
      NS nonce sum,该标签用来保护不受发送者发送的突发的恶意隐藏报文的侵害。详见 RFC 3540。
      CWR Congestion window reduced,发送者在接收到一个带有ECE flag包时,将会使用CWR flag。 详见RFC3168。
      ECE ECN-Echo,ECN表示Explicit Congestion Notification。表示TCP peer有ECN能力。
      URG Urgent,通知接收端处理在处理其他包前优先处理接收到的紧急报文(urgent packets)
      ACK Acknowledgement,表示确认对方的请求
      PSH Push,通知接收端处理接收的报文,而不是将报文缓存到buffer中
      RST Reset,表示连接重置。用于重置由于主机崩溃或其他原因而出现错误的连接。或者发送包发送到一个不是期望的目的主机时,接收端发送reset 重置连接标志的包。
      SYN Synchronization,表示建立连接
      FIN Finish,表示请求断开连接
    • Windows size(窗口大小):16位。

      允许对方发送的数据量。告诉对方自己缓冲区还能容纳多少字节,用来控制对方发送数据的速度。

    • Checksum(校验和):16位。

      发送端对TCP首部、数据进行CRC运算得到的结果。接收端收到数据后,对TCP报文的首段、数据进行CRC运算,并跟TCP首部的校验和进行对比,确保数据在传输过程中没有损坏。

    • Urgent pointer(紧急指针):16位。

      仅在URG=1时才生效,它的值是一个偏移量,和序号段中的值相加得到紧急数据的最后一个字节的序号。

    • Options(可选字段):大小不固定。

      最常见的可选字段是MSS(Maximum Segment Size),表示最长报文大小,通信双方通常在连接的第一个报文段中指明这个选项。

    TCP的11种状态

    TCP 在连接、传输、断开连接过程中,有11种状态,标记着客户端和服务端在各个交互阶段的状态。

    状态 含义
    CLOSED socket套接字初始状态,表示TCP连接时关闭的,或未打开
    LISTEN 监听状态,表示服务端的某个socket处于监听状态,可以接受客户端的连接
    SYN_SENT 客户端向服务端发送SYN请求连接(第一次握手),随即客户端进入SYN_SENT状态
    SYN_RCVD 表示服务器接收到了客户端的SYN请求连接报文,并在发送SYN+ACK报文(第二次握手)后,进入SYN_RCVD状态。
    ESTABLISHED 表示TCP连接已经成功建立。
    FIN_WAIT1 客户端请求关闭连接(第一次挥手),向服务端发送FIN数据包,客户端随即进入FIN_WAIT1状态
    CLOSE_WAIT 服务端接收到客户端的FIN数据包后,就回复ACK确认数据包(第二次挥手),随即服务端进入CLOSE_WAIT状态。
    FIN_WAIT2 客户端接收到服务端的ACK确认报文后,进入FIN_WAIT2状态,此时客户端仍能接受数据。
    LAST_ACK 服务端发送确认中断后,回复FIN断开连接报文,然后进入LAST_ACK最后确认关闭状态(第三次挥手)
    TIME_WAIT 客户端在FIN_WAIT2状态下接收到服务端的FIN报文后,回复客户端ACK确认报文,随即进入TIME_WAIT状态。客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,最终进入 CLOSED 状态。(第四次挥手)

    TCP 交互的流程图:

    状态转换图

    image-20200307184102569

    客户端状态转换

    image-20200306015019811

    服务端状态转换

    image-20200306015052417

    参考资料

    https://en.wikipedia.org/wiki/Transmission_Control_Protocol

    https://baijiahao.baidu.com/s?id=1626222867928553865&wfr=spider&for=pc

  • 相关阅读:
    后台管理系统文件三部曲之——第三部曲实现文件的查看预览
    后台管理系统文件三部曲之——第二部曲实现文件的下载
    后台管理系统文件三部曲之——第一部曲实现文件的上传
    数组includes的使用之在字典里获取数据
    在Swift3里面实现点击不同按钮播放不同声音的一种实现方法
    如何在Swift3中获取Json包的内容(unwrap Json package)
    点击TableView任一行跳转详情页面会跳转两次的解决办法
    UITableView数据不显示(在console中已显示相应数据)
    关于“代理”(delegate)我的一点浅见
    出现 warning "Unknown class _??????????View in Interface Builder file."的原因
  • 原文地址:https://www.cnblogs.com/zhaooo/p/13991883.html
Copyright © 2020-2023  润新知