1、前言
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。
使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上之后的数据的传输。TCP连接是全双工的,即双方的数据读写可以通过一个连接进行。完成数据交换后,通信双方都必须断开连接以释放系统资源。
TCP连接是一对一的,所以基于广播和多播应该使用UDP协议。
本文将分别讲解TCP协议建立连接(所谓的“3次握手”)和断开连接(所谓的“4次挥手”)的过程。有关TCP协议的权威理论介绍,请参见《TCP/IP详解》这本书。
2、参考资料
TCP协议的可靠传输详解
HTTP和HTTPS
网络分层模型以及对应的协议
3、TCP报文格式
TCP头部详解如下,部分图上不好画的,在下文会有文字解释。
对上图的部分说明
端口号:
在进行TCP通信时,客户端使用系统自动选择的临时端口号,服务器采用知名服务端口号,如DNS协议端口号53,HTTP协议端口号80。知名服务使用的端口号定义在/etc/services。
六位标志位包含以下几项:
URG:表示紧急指针是否有效;
ACK:表示确认号是否有效,携带ACK标志的数据报文段为确认报文段;
PSH:提示接收端的应用程序应该立即从TCP接受缓冲区中读走数据,为接受后续数据腾出空间;
RST:表示要求对方重新建立连接,携带RST标志位的TCP报文段成为复位报文段;
SYN:表示请求建立一个连接,携带SYN标志的TCP报文段为同步报文段;
FIN:通知对方本端要关闭了,带FIN标志的TCP报文段为结束报文段。
确认序号:
Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
TCP头部选项:
TCP头部选项是一个可变长的信息,这部分最多包含40字节,因为TCP头部最长60字节,(其中还包含前面20字节的固定部分)。
为什么在TCP首部的开始便是首部长度字段而UDP首部却没有?
因为UDP提供无连接服务,它的数据包包头,是固定长度的8字节,不存在可选字段,可以减少很多传输开销,所以它无需使用首部字段长,因为它的首部就是固定的。
而TCP提供连接服务,它的数据包包头,除了固定的20字节之外,还存在一个可选项,这个可选项字段,是根据TCP连接的要求而变动。这一字段最常见到的就是最大报文大小MSS,它指明发送端所能接收的最大长度的报文段。因为这个字段的存在,所以TCP包头使用了首部长字段。它占4位,以四字节为单位表示TCP包头长度,也就是说,TCP的首部最大长度可以是15x4=60字节,而可选项长可以为60-20=40字节