前言
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。
使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上之后的数据的传输。TCP连接是全双工的,即双方的数据读写可以通过一个连接进行。完成数据交换后,通信双方都必须断开连接以释放系统资源。
TCP连接是一对一的,所以基于广播和多播应该使用UDP协议。
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首部却没有?1
2
3
4
5
6
7
8
9因为UDP提供无连接服务,它的数据包包头,是固定长度的8字节,不存在可选字
段,可以减少很多传输开销,所以它无需使用首部字段长,因为它的首部就是固定的。
而TCP提供连接服务,它的数据包包头,除了固定的20字节之外,还存在一个可
选项,这个可选项字段,是根据TCP连接的要求而变动。这一字段最常见到的就
是最大报文大小MSS,它指明发送端所能接收的最大长度的报文段。因为这个字
段的存在,所以TCP包头使用了首部长字段。它占4位,以四字节为单位表示TCP
包头长度,也就是说,TCP的首部最大长度可以是15x4=60字节,而可选项长可以为60-20=40字节