TCP是一个面向连接的协议,在发送数据之前,必须在双方之间建立一条连接。
TCP首部
TCP数据封装在IP数据报中
TCP包首部
下面简单说明部分字段的作用:
端口号:通讯双方由IP地址和端口号标识。
4位首部长度:表示TCP协议头的长度,以4字节为单位。因此TCP最长协议头是4×15=60字节,如果没有选项字段,TCP协议头最短20字节。
6个标志比特含义:URG:紧急指针有效; ACK:确认序号有效; PSH:接收方应尽快将这个报文段交给应用层; RST:重新连接; SYN:同步序号用来发起一个连接; FIN:发端完成发送任务
窗口大小:提供TCP的流量控制
检验和:由发端计算和存储,由收端进行验证
通讯时序
TCP通讯时序图
建立连接过程:
- 客户端发出段1,SYN表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地址,每发送一个数据字节,这个序号加1,这样在接收端可以根据序号排出数据包的正确顺序,也可发现丢包的情况,另外规定SYN位和FIN位也必须占一个序号。这次没有发送数据,但是发送了SYN位,因此下次再发送应该用序号1001。mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为避免这种情况,客户端声明自己的最大尺寸,建议服务器发来的段不要超过这个长度。
- 服务端发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到了序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就应答了客户端的连接请求,同时也给客户端发出一个连接请求,同时声明最大尺寸为1024.
- 客户端发出段3,对服务器的连接请求进行应答,确认序号是8001。
以上便是建立连接三次握手的具体过程。在TCP通讯中,如果一方接收到对方发来的段,读出其中的目的端口号,发现本机并没有进程使用此端口,就会应答一个包含RST位的段给另一方。
数据传输过程:
- 客户端发出段4,包含从序号1001开始的20个字节数据。
- 服务器发出段5,确认序号为1021,对序号1001-1020的数据表示确认收到,请求发送序号1021开始的数据。服务器应答的同时也向客户端发送从序号8001开始的10字节数据,这称为piggyback(捎带确认)
- 客户端发出段6,对序号8001-8010的数据表示确认收到,请求发送序号8011开始的数据。
在数据传输过程中,ACK和确认序号是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区中,发出数据包给对方之后,只有收到对方应答的ACK段才知道该数据包确实发送到了对方,可以从发送缓冲区中释放掉了。如果因为网络故障丢失了数据包或者丢失了对方回复的ACK段,经过等待超时后的TCP协议自动将发送缓冲区中的数据包重发。
关闭连接过程:
- 客户端发出段7,FIN位表示关闭连接的请求。
- 服务器发出段8,应答客户端的关闭连接请求。
- 服务器发出段9,也包含FIN位,向客户端发送关闭连接请求。
- 客户端发出段10,应答服务器的关闭连接请求。
建立连接是三次握手,关闭连接通常需要4段,服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端不能发给服务器,但服务器还能发给客户端。
流量控制
TCP协议通过“滑动窗口”机制进行流量控制。