TCP协议的三次握手与四次握手

可以根据抓包来分析三次握手与四次握手:

端口40286表示客户端client,端口9000表示服务端server

三次握手:

a.client向server发送SYN=1,ACK=0,Seq=x(此阶段不会有Ack),client状态为SYN_SNET;

b.server收到client的SYN请求,发送SYN=1,ACK=1,Seq=y,Ack=x+1,server状态从LISTEN > SYN_RECV

c.client收到server的ACK,发送SYN=0,ACK=1,Seq=x+1,Ack=y+1,client状态从SYN_SENT > ESTABLISHED,server状态从SYN_RECV > ESTABLISHED

三次握手

状态变化:

client:SYN_SENT > ESTABLISHED

server:LISTEN > SYN_RECV > ESTABLISHED

四次握手:

a.client向server发送FIN=1,ACK=1,Seq=M,Ack=N,client状态从ESTABLISHED > FIN_WAIT_1,此时client不再发送数据,但是可以接受数据

b.server收到client的请求断开连接请求,发送FIN=0,ACK=1,Seq=N,Ack=M+1,server状态从ESTABLISHED > CLOSE_WAIT;server表示知道client要断开连接了,server也许还有没有发送完的数据,所以并没有立即发FIN;此时client收到server的ACK报文,client状态从FIN_WAIT_1 > FIN_WAIT_2

c.server确认没有数据要发送给client,发送FIN=1,ACK=1,Seq=T,Ack=M+1,server状态从CLOSE_WAIT > LAST_ACK

d.client收到server的FIN报文,发送FIN=0,ACK=1,Seq=M+1,Ack=T+1,client状态从FIN_WAIT_2 > TIME_WAIT,client经过2MSL(最大分段寿命(Maximum Segment Lifetime (MSL) ,默认2min)后状态从TIME_WAIT > CLOSE;server接收到client的ACK报文,状态从LAST_ACK > CLOSE

四次挥手

状态变化

client:ESTABLISHED > FIN_WAIT_1 > FIN_WAIT_2 > TIME_WAIT > CLOSE

server:ESTABLISHED > CLOSE_WAIT > LAST_ACK > CLOSE

一些问题:

a.为什么建立连接需要三次握手?

虽然可以有这些回答:因为前期没有建立连接,双方都不会有数据发送,所以不必像断开连接时的四次握手;或者,如果只需要两次握手,也许中间的网络延迟原因,client又重发了一次SYN,而这SYN到达server之后,server则又会创建一个连接,但此连接在cllient并无效,所以需要第三次连接。但是这些回答总觉得不能使人信服;

从TCP的本质来看,TCP是可靠性传输,但是为什么可靠?可靠的依据是什么?这里就需要深入了解一下Seq和Ack代表的实际意义;Seq:占 4 字节,序号范围[0,2^32-1],序号增加到 2^32-1 后,下个序号又回到 0。Ack:占 4 字节,期望收到对方下个报文段的第一个数据字节的序号。TCP 是面向字节流的,通过 TCP 传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号。TCP通过确认这些Seq来保证数据是正确接收和发送或重发;

从上可知三次握手主要是为了双方确认对方的Seq初始序列号;

b.为什么断开连接需要四次握手?三次握手行不行?

从断链阶段可以看出,主要是为了在server端未发送完成的数据发送到client端;如果能确保在收到client的FIN报文时,server在下次的报文中(FIN+ACK)将数据全部发出,三次也是可以的,不过并不标准;

c.为什么断开连接时客户端向服务端发送ACK报文后不直接进入CLOSE而是进入了TIME_WAIT?

主要为了能够在TIME_WAIT的2MSL时间内,client发送的ACK报文能够准确到达server;对于服务器来说,如果没有收到最后的ACK报文,那么又会重新发一次FIN+ACK报文给client,如果client在TIME_WAIT时间内收到这个报文,就会重发ACK报文并重置2MSL时间;

 

Task

TCP三次握手与四次握手

Reflect and Recite

Record and Reduce

  • 三次握手与四次握手

  • 三次握手与四次握手状态变化

 

  • 三次握手与四次握手区别?

  • TIME_WAIT的作用?

  1. 三次握手

    <1>client send SYN to server                (Seq=x)

    <2>server send SYN and ACK to client (Seq=y,Ack=x+1)

    <3>client send ACK to server                (Seq=x+1,Ack=y+1)

  2. 四次握手

    <1>client send FIN and ACK to server   (Seq=m)

    <2>server send ACK to client                 (Seq=n,Ack=m+1)

    <3>server send FIN and ACK to client   (Seq=v,Ack=m+1)

    <4>clinet send ACK to server                 (Seq=m+1,Ack=v+1)

  3. 三次握手状态变化

    client:SYN_SNED > ESTABLISHED

    server:LINSTEN > SYN_RECV > ESTABLISHED

  4. 四次握手状态变化

    client:ESTABLISHED > FIN_TIME_1 > FIN_TIME_2 > TIME_WAIT > CLOSE

    server:ESTABLISHED > CLOSE_WAIT > LAST_ACK > CLOSE

  5. 2MSL,最大分段寿命

Review 

 

 

最后推荐一篇blog,写得非常不错https://blog.csdn.net/qzcsu/article/details/72861891

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值