写在前面:
仅供学习使用
TCP连接建立与终止
基础部分
TCP三次握手
-
TCP会话初始建立的过程,称为三次握手。
-
SYN--同步位、ACK--确认位、SEQ number--初始序列号、ACK number--确认号(这里用ack表示)。
-
关于初始序列号SEQ number的思考:
-
为什么需要SEQ:
-
初始SEQ是怎么算出来的:
-
三次握手的过程:
第一次握手客户端请求建立连接,客户端的ACK=0,发送SYN=1,SEQ=X,客户端进入SYN_SENT状态。
第二次握手服务端确认建立连接请求,服务端发送SYN=1,ACK=1,SEQ=Y,ack=X+1,服务端进入SYN_RECV状态。
第三次握手客户端和服务端成功建立连接,客户端将SYN置为0不发送,然后发送ACK=1,SEQ=X+1,ack=Y+1,两端同时进入ESTABLISHED状态。
TCP四次挥手
-
TCP会话结束时的过程,称为四次挥手。
-
FIN--结束位、ACK、SEQ number、ACK number(这里用ack表示)。
-
四次挥手的过程:
第一次挥手客户端请求释放连接,并停止发送数据,发送FIN=1,SEQ=I,客户端进入FIN_WAIT_1状态。
第二次挥手服务端确认释放连接请求,发送ACK=1,SEQ=J,ack=I+1,服务端进入CLOSE_WAIT状态,这时服务端可能还有数据未发送完,客户端还要接收数据,所以处于半关闭状态,此时客户端处在FIN_WAIT_2状态。
第三次挥手在处于CLOSE_WAIT状态的服务端,数据已经完全发送给客户端了,发送FIN=1,ACK=1,SEQ=K,ack=I+1,服务端进入LAST_ACK状态。
第四次挥手客户端确认释放连接,发送ACK=1,SEQ=I+1,ack=K+1,客户端进入TIME_WAIT状态并于2MSL(最长报文段寿命)后进入CLOSED状态,服务端在接收到确认数据包的时候就立即进入CLOSED状态,时间上可能较客户端稍早。
最大报文段长度MSS(Maximum Segment Size)
-
当一个连接建立时,连接的双方都要通告各自的MSS。
-
通俗一点来讲就是通信双方能够发送的报文段长度不一样,这是由于MTU决定的,MTU默认1500字节,可以被修改。MSS的意思就是我们需要发送出去的数据大小,以小的那方为最大报文段长度,传输的时候防止丢失数据。MSS+包头=MTU。
进阶部分
连接建立超时
-
TCP三次握手时,无法顺利建立的状态。
-
SYN重传--服务器被关闭、SYN/ACK重传--被ACL过滤TCP包
连接关闭超时
-
TCP四次挥手时,无法顺利关闭的状态。
-
ACK或者FIN异常。
TCP半关闭
-
当TCP一方发送FIN进行单方向会话关闭时,另外一方仍然可以发送数据给对方,此状态称为TCP半关闭。
TCP半打开
-
如果一方已经关闭或者异常终止连接,而另外一方还不知道,称为TCP半打开(Half-open)
TCP同时打开、同时关闭
-
同时关闭多了个CLOSING状态。
TCP可靠传输机制
确认机制
-
通过序列号、确认号、分组长度等字段,接收方对发送方的数据进行实时反馈。
-
在不丢包等情况下,一般依据 ACK(n+1)=SEQ(n)+LEN(n) 方式进行可靠确认。
即①客户端发送SEQ=100,LEN=100,②服务端接收到后发送ACK=211(之前客户端发送的SEQ+LEN),SEQ=任意,LEN=任意,③然后客户端接收到后又发送ACK=422,SEQ=...④...⑤...。
重传机制
-
第一种情况,发送方没有收到接收方的确认消息,发送方觉得丢包了,于是启动超时重传机制。
-
第二种情况,接收方检测到数据包丢失了,此时主动返回确认消息给发送方要求重传,这是快速重传/选择性重传机制。
-
超时重传机制是一种被动式的方式,快速重传/选择性重传机制是一种主动式方式。
超时重传
-
当发送方没有接收到返回的ACK时,则认为数据丢失,此时发送方依据RTO重传超时时间来对未确认数据包进行重传操作。
-
Windows最多重传5次,Linux最多重传15次。
-
RTT(Round Trip Time):往返时间,记录数据从发出到收到确认所使用的时间。
-
RTO(Retransmission Timeout):重传超时时间,数据丢失后依据RTO值来进行重传,一般RTO依据RTT计算得出。
RTO计算
-
RFC 793 公式:
/*M为当前测试出来的往返间隔、R为以前测试出来的往返间隔、a是一个值为0.9的平滑因子、β推荐值为2。当RTT全局变化较大时,这种算法无法得到网络比较好的RTO值*/
R<--a*R+(1-a)*M
RTO=R*β
RTO=2*RTT
-
RFC 6298/Jacobson 1988 公式:
/*M为当前测试出来的往返间隔、A为被平滑的RTT(均值的估计器)、Err是刚得到的测量结果与当前的RTT估计器之差、g取值为0.125(1/8)、h取值为0.25、D为平滑的均值偏差。超时重传时间由平滑的RTT和RTT的方差来决定。在往返时间变化起伏比较大的情况下,基于均值和方差来计算RTO比只用均值的常数倍数来计算RTO提供更好的网络状况描述*/
Err=M-A
A<--A+g*Err
D<--D+h*(|Err|-D)
RTO=A+4*D
待续。。。