计算机网络协议之TCP

传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。

OSI模型

OSI模型结构

tcp报文格式

tcp header
tcp header wiki

  • 源端口、目的端口:和IP协议中的源IP、目的IP一起确定每一个确定的连接。TCP的包是没有IP地址的,那是IP层上的事。
  • Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
  • Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题。
  • 首部长度 (数据偏移,Header Length):由于选项部分长度可变,所以需要首部长度字段明确表示首部的长度。
  • Window又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控,指定流控窗口的大小。
  • 控制标记位:
    • URG (Urgent Bit):紧急指针是否有效,1表示有效
    • ACK (Acknowledgment Bit):1表示确认号字段有效
    • PSH (Push Bit):接收方是否尽快将报文段交给应用层,1表示有效,接收方应该尽快将报文段交给应用层而不用等待缓冲区装满。
    • RST (Reset Bit):重建连接,为1表示出现严重差错。可能需要重新建立TCP连接。可以用于拒绝非法的报文段和拒绝连接请求。
    • SYN (Synchronize Bit):用于发起一个连接,为1表示这是连接请求或是连接接受请求,用于建立连接和使顺序号同步。
    • FIN (Finish Bit):用于关闭连接,为1表示发送方没有数据要传输了,要求释放连接。
  • 校验和 (Checksum):用于校验数据的完整性。
  • 紧急指针 (Urgent Pointer):当URG为1时生效,用于TCP发送端向接受端发送紧急数据。

tcp状态机、三次握手和四次挥手

tcp状态机
三次握手和四次挥手

  • 对于建链接的3次握手,主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
  • 对于4次挥手,因为TCP是全双工的,所以,发送方和接收方都需要FINACK
  • 主动断开链接的一方,会出现 TIME_WAIT 状态。

客户端和服务端同时断开链接

参考