文字版 描述TCP三次握手和四次挥手以及有限状态机等

客户端和服务器 ,双方都处于第一次交互的情况下展开通信
 

三次握手

 
 
1.首先 服务器 需要是处于listen收听状态下才能接受报文
客户端由closed状态 打开并向服务器发送报文
SYN=1 申请建立联机
seq=a (这里的seq的顺序号也就是tcp包头的序号,如果双方通信次数)
  
 
  
 
2.第二步:
服务器B返回信息
ACK=1 已收到确认 并向A也发送一个包请求通讯 seq=b1
ack确认号也要+1
(这里为什么要+1 是因为B已经收到了ack包 如果你再发的话需要你发 ack+1的包)
而大写的ACK是确认号 表示前面f发过来的那个包 或者字段是否有效。当ACK=1时,前面的确认号字段才有效。0则无效
这时候服务器和客户端都处于SYN-RCVD状态 (同步收到)
 
 
 
3.第三步:客户端返回服务器
首先大写的ACK=1 确认有效性
这时候 客户端A要再给服务器B发的包的话。seq的顺序号就要+1了
也就是seq=a+1
并且在给服务器B返回ack=y+1 也就是告诉b你上一个ack=y的包我已经收到了 再发的话需要你发 y+1的包
 
这时候服务器和客户端的状态都处于ESTAB-LISHED(已建立连接状态)
 

4.之后 客户端a和服务器b就可以进行正常的数据传送了

 
 
 
 
 

四次挥手

 
还是 A客户端 B服务器
一般都是客户端对服务器发起请求断开链接
当然 服务端也可以向客户端发起断开链接的请求
(用客户端向服务器提出断开链接 举例子)

 
当需要断开链接的时候

 
 
第一步:
客户端A 对服务器B发出
FIN=1 的数据包(FIN(finish结束))
seq=u 包的序号
并且客户端的状态从建立链接
ESTAAB-LISHED状态切换到 FINWAIT-1终止等待状态
seq=u 序号为u的包
 
  
第二步:
服务器返回ACK(acknowledgement 确认) 确认接收到 断开链接的包了
返回ack=u+1 并告知客户端。你的上一个包已经收到。下次再发请发ack=u+1的包
并且。返回的给客户端的报头编号为
seq=v
ack=u+1

服务器的状态变更为close-wait 关闭等待

客户端接收到第二步的包时 客户端的状态立即切换到 FIN-WAIT2 终止等待2的状态

 
  
第三步:
由于客户端已经对服务器发起了断开链接请求。也就是客户端已经没有数据向服务器发送了。。
但是服务器可能还有数据没有对客户端传送完毕。
当服务器对客户端的数据传送完毕之后
会对客户端在发起新的数据报文
FIN=1 确认关闭
ACK=1
seq=w 序列号 (这里的为什么不是V+1 因为 第三步和第四部之间 服务器会给客户端传送剩余的数据,所以这里的seq编号。就变很多了,暂且用w表示 而不是 seq=v+1)
ack=u+1 确认
客户端的状态变更为 last-ack 最后确认 状态
  
 
第四步:
当客户端收到了 第三步的包
立即回应 并确认 断开链接
ACK=1
seq=u+1 ack=w+1
并且客户端的状态 切换到 time-wait 时间等待 状态
(由于网络的情况或许有延迟,丢包等情况,有可能会出现 数据还没传送完毕。但是服务端的确认断开链接的报头先到了。。 为了保证接收到了所有数据。客户端会等待一段时间,等待2MSL (1))

  
 

第五步:
服务器当收到客户端的第四步回应的报头 直接就处于closed 关闭状态了

客户端需要 等待2MSL后 才会进行closed关闭状态

 
 

补充:
MSL是什么;aximum Segment Lifetime
报文的最大生命时间。何报文在网络上存在的最长时间,超过这个时间报文将被丢弃

 
  
 

有限状态机FSM:Finite State Machine

 
CLOSED 没有任何连接状态
LISTEN 侦听状态,等待来自远方TCP端口的连接请求
SYN-SENT 在发送连接请求后,等待对方确认
SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
ESTABLISHED 代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭 传输连接请求
TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认
LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
CLOSING 双方同时尝试关闭传输连接,等待对方确认

 
 
  
 
 

TCP包头

 
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
 
ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。 TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
 
PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空 间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序 不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
 
RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必 须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应, 带RST标志的TCP报文段称为复位报文段
 
SYN:在建立连接时使用 用来同步序号。当SYN=1,ACK=0时 表示这是一个请求建立连 接的报文段当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求 建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文 段称为同步报文段
 
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方: “我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

猜你喜欢

转载自blog.51cto.com/12580998/2165106