TCP/IP学习笔记-TCP协议

写在前面:

仅供学习使用

TCP连接建立与终止

基础部分

TCP三次握手

  • TCP会话初始建立的过程,称为三次握手。

  • SYN--同步位、ACK--确认位、SEQ number--初始序列号、ACK number--确认号(这里用ack表示)。

  • 关于初始序列号SEQ number的思考:

  1. 为什么需要SEQ:
    3deaf9f862b08ca950c6dba73e919cf1.png

  2. 初始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

待续。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值