TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 将用户数据打包成报文段,它发送后启动一个定时器,另一端对收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。
1. TCP协议特点
-
TCP是面向连接的传输层协议。应用程序在交换数据之前,必须先建立TCP连接,数据交换完成后,必须释放TCP连接。
-
每一条TCP连接只能有两个端点,即套接字。
-
TCP提供可靠交付的服务。传送的数据无差错、不丢失、不重复、按序到达。
-
TCP提供全双工通信。数据在两个方向上独立的进行传输。
-
面向字节流。虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
2. TCP报文段首部
- 源端口和目的端口 各占2个字节。
- 序号 占4个字节。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。
- 确认号 占4个字节。期望接收到对方下一个报文段的第一个数据字节的序号。
- 数据偏移 占4位。TCP 数据部分在TCP报文段的位置,反映了TCP报文段的首部长度。首部长度范围是20~60字节。
- URG 紧急,URG=1时,表示报文段中有紧急数据,应尽快传送。紧急数据会插入到本报文段数据的最前面。
- ACK 确认,ACK=1有效。在连接建立后所有传送的报文段必须把ACK置为1。
- PSH 推送,发送方TCP把PSH置为1时,接收方就尽快的交付接收应用进程。
- RST 复位,RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立TCP连接。
- SYN 同步,在连接建立时用来同步序号。
- FIN 终止,用来释放TCP连接。
- 窗口 占2个字节。接收方允许对方发送的数据字节数。
- 校验和 占2个字节。校验TCP首部和数据两部分,由发送方计算和存储,接收方进行验证。
- 紧急指针 占2个字节。在URG=1时才有效,它指出紧急数据的末尾在报文段中的位置。
- 选项 长度范围0~40字节。
3. TCP建立和释放连接
三次握手建立TCP连接
(1)客户端向服务器发送连接请求报文段。标志位SYN=1,序号seq=x。
(2)服务器收到客户端发送的报文段,同意建立连接则向客户端发送确认。标志位SYN=1,ACK=1,序号seq=y,确认号ack=x+1。
(3)客户端收到服务器发送的报文段,向服务器发送确认。标志位ACK=1,序号seq=x+1,确认号ack=y+1。
此时TCP连接已建立,客户端和服务器都进入 ESTABLISHED 状态。
四次挥手释放TCP连接
(1)客户端向服务器发送连接释放报文段,并停止发送数据,主动关闭连接。标志位FIN=1,序号seq=u。
(2)服务器收到报文段后发送确认。标志位ACK=1,序号seq=v,确认号ack=u+1。然后服务器进入 CLOSE_WAIT 状态。
(3)服务器没有数据要发送时,应用进程会通知TCP释放连接。服务器向客户端发送连接释放报文段,关闭与客户端的连接。标志位FIN=1,ACK=1,序号seq=w,确认号ack=u+1。然后服务器进入 LAST_ACK 状态。
(4)客户端收到报文段后发送确认。标志位ACK=1,序号seq=u+1,确认号ack=w+1。然后客户端进入 TIME_WAIT 状态,并等待计时器设置的 2MSL(报文段最大存活时间)时间后才释放连接,进入 CLOSED 状态。
4. TCP可靠传输
TCP发送方在规定的时间内没有收到确认就要重传已发送的报文段。超时重传就是每次发送数据后启动一个计时器,在计时器到期时间前收到了确认就撤销计时器,否则就重传报文段。发送方在收到确认前必须保留已发送数据的副本,用于超时重传使用。
TCP采用了一种自适应算法Karn,它记录了报文段发出的时间以及收到确认的时间。这个时间差就是报文段的往返时间RTT。超时重传时间RTO设置时应略大于加权平均往返时间RTTS。
5. TCP流量控制和拥塞控制
滑动窗口机制实现对TCP连接的发送方流量控制,使发送速率不要太快。发送方的发送窗口不能超过接收方的接收窗口的数值。
判断网络出现拥塞的依据就是出现了超时。TCP拥塞控制算法:慢开始、拥塞避免、快速重传、快速恢复。
慢开始、拥塞避免都是基于窗口的拥塞控制。发送方维持一个拥塞窗口,发送窗口等于拥塞窗口。然后逐渐增大发送方的发送窗口数值。
快速重传和快速恢复算法能够快速恢复丢失的报文段。快速重传算法要求接收方对收到的报文段立即发送确认,即使收到失序的报文段也要发送对已收到报文段的重复确认。发送方连续收到3个重复确认,就认为报文段丢失,立即重传丢失的报文段。随即进入快速恢复算法,设置拥塞窗口数值,并执行拥塞避免算法。