分享

网络协议实战教程02:三次握手四次挥手

 程序员小谭 2022-03-02

测试奇谭,BUG不见。

大家好,我是谭叔。

文接上回,本期重点理解握手和挥手。注意,是理解,而非死记硬背。

理论

说起测试工程师的面试,有一道经典题——什么是(为什么要)三次握手和四次挥手。

曾几何时,我也为这道题折过腰。但时过境迁,现在再来讲解它,so easy~

首先,我们从现实生活中理解:

1、握手:同他人建立关系;

2、挥手:拜拜了,您勒。

其次,再从理论层面理解:

1、三次握手:建立可靠的连接。使双方能确认自己与对方的发送与接收功能正常。

2、四次挥手:断开连接。但是,握手了三次,为什么要挥手四次呢?这块搭配下面的实战更好理解,所以我先卖个关子,不跟大家讲太多。

三次握手实战

访问testtalking.com网站,用Wireshark抓首页的GET请求,然后点击鼠标右键,追踪TCP流。

筛选命令:http.request.method==GET && ip.dst==121.5.121.205

121.5.121.205 是testtalking.com服务器的ip

追踪后,你可以对照着我的图片,查看到三次握手和四次挥手的记录。

①source指报文发起方

②121.5.121.205是testtalking.com服务器的ip,打码的xxxx.238是我本机电脑的ip。

上文我们说道,TCP在收发数据前,必须和对方建立可靠的连接。建立稳定的TCP连接,需要三次握手,即,

  1. 读者:谭叔,你听得到么?我想给你三连点赞。

  2. 谭叔:我听到你的承诺了,说话算数!

  3. 读者:谭叔,我要三连点赞了。

1、第一次握手

读者:谭叔,你听得到么?我想给你三连点赞。

建立连接时,客户端(你的浏览器)发送 SYN 报文到服务器(testtalking),等待服务器确认。

SYN:同步序列编号Synchronize Sequence Numbers的简写

客户端向服务器发送连接请求包时:

①将SYN Set为1

②发送序号 Seq (Sequence number)为0

2、第二次握手

谭叔:我听到你的承诺了,说话算数!

服务器收到客户端发过来的报文,并且因为SYN=1,服务器知道客户端想建立连接,于是开始处理:

①服务器设置确认序号ACK为1

ACK:确认序号Acknowledgement Number的简写。

ACK是如何计算的?ACK =  Seq(第一次握手的Seq值)+1 = 0+1 =1

②设置SYN为1

③将该TCP报文(发送序号Seq=0)发送给客户端。

3、第三次握手

读者:谭叔,我要三连点赞了。

客户端收到服务器的SYN+ACK包,也会给服务器发送一个确认序号ACK,发送后,客户端和服务器TCP连接成功,完成三次握手。

ACK = 发送序号Seq(第二次握手的)+1 = 0+1 =1

综上所述

一个完整的三次握手为:客户端请求(SYN)-> 服务器应答(SYN+ACK)-> 客户端确认(SYN)。完成三次握手,客户端与服务器开始传送数据。

嗯嘛,你可以给本文点赞了~

此时,你再看这张网图,是不是能看懂了?

四次挥手实战

TCP建立连接要三次握手,但断开连接为什么要多一次呢?

说得简单点:告别是双向的,且谁都可以发起,并且对方要确认。A告诉B,B确认,B再告诉A,A确认,一共四次。

以本次实战举例,挥手阶段,服务器是首次发起方。即,

  1. 谭叔:朋友们,下篇文章再见。

  2. 读者:好的。

  3. 读者:谭叔,下篇文章我们继续点赞。

  4. 谭叔:好的。

1、第一次挥手

谭叔:朋友们,下篇文章再见。

服务器(testtalking)给客户端(你的浏览器)发送TCP包,用来关闭服务器到客户端的数据传送,即,

①将FINACK置为1

FIN:Finish的简称。代表要关闭连接。

②发送序号Seq为482(你的可能不是482,对照着看)

③确认序号Ack为803(同上)

2、第二次挥手

读者:好的。

客户端收到服务器的FIN后,会做确认:

①发回一个ACK,置为1

②发送序号Seq = 803(为收到的第一次挥手确认序号Ack)

③确认序号Ack= 483(为收到的第一次挥手发送序号+1=482+1=483)

3、第三次挥手

读者:谭叔,下篇文章我们继续点赞。

客户端(你的浏览器)给服务器(testtalking)发送TCP包,用来关闭客户端到服务器的数据传送。

①发送一个FINACK,置为1

②发送序号Seq = 803(你的可能不是803,对照着看)

③确认序号Ack = 483(为收到第一次挥手发送序号+1=482+1=483)

4、第四次挥手

谭叔:好的。

服务器收到客户端发送的FIN之后,

①发回一个ACK,置为1

②发送序号Seq = 483 (为收到的第一次挥手发送序号Seq+1=482+1=483)

③确认序号Ack=804(为收到的第三次挥手的发送序号Seq+1=803+1=804)

综上所述

一个完整的四次握手为:A请求断开(FIN+ACK)-> B应答(ACK)-> B请求断开(FIN+ACK)-> A应答(ACK)。完成四次挥手后,客户端与服务器断开连接。

此时,你再看这张网图,是不是能看懂了?

总结

TCP为什么要三次握手和四次挥手?

标准答案:TCP是面向连接的通信方式, 采取此方式能大大提高数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了连接, 为数据正式传输打下了可靠的基础。

个人理解答案:

三次握手:A说我来了。B说你来吧。A说那我来了。

四次挥手:A说我走了。B说你走吧。B说我也走了,A说你走吧。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多