通过Wireshark学习三次握手、四次挥手

前言:

    TCP的三次握手、四次挥手是大家耳熟能详的。
    笔者实际是个网络方面的渣渣。每次在面试前都要狂补一下相关知识点用于应付面试(大家都懂的。。哈哈)。
    但是老是这样也不行,每次都是一个模糊的概念,所以这次准备用Wireshark工具来真正验证下三次握手和四次挥手的过程(我的工具应用也是个渣渣),记录下。
    想在这条路上走的更远,以后还是要加强在网络方面的学习,共勉吧!
 

准备工作:

    1.Wireshark工具的安装,这个就不说了,网上一大把相关文章。
    2.一次http请求。
        笔者之前尝试直接分析 www.baidu.com  的访问请求,但是这个请求的数据实在有点多,对于我这个菜鸟来说,有点复杂了,所以后面就想访问本地请求,自己写一个SpringBoot项目,给一个Controller,一个get请求方法,简单的返回一个字符串,就可以了。在本示例中访问路径为http://localhost:8888/wireshark

 

基础知识:

    1.名词释义

        SYN(Sequence Number):发送数据的顺序编号
        ACK(Acknowledge):接收数据的 顺序编号,告知发送方已经接收到所有数据的第几个字节
        Flags(控制位):该字段的每个bit分别表示一个通信控制含义
            URG:紧急指针字段有效;
            ACK:数据已被接收方收到;
            PSH:表示通过flush操作发送的数据
            RST:强制断开连接,用于异常中断的情况;
            SYN:发送方和接收方相互确认序号,表示连接操作;
            FIN:表示断开连接
 
        MSS(Max segment size):最长报文段,TCP包所能携带的最大数据量。
        

    2.三次握手图

    3.四次挥手图

    4.TCP header内容格式

 

Wireshark使用:

    1.捕获一次请求

       1)打开wireshark,双击Npcap Loopback Adapter

        2)我们需要过滤多余的请求,直接选择tcp.port==8888,也就是我们上述的请求端口

        3)发起一次请求

        在浏览器中发起一次请求,url为http://localhost:8888/wireshark 。

        需要注意的是:尽量新开浏览器发起请求,否则可能会重新TCP连接,无法观察到三次握手。

    2.观察三次握手

    我们来依次看这三次请求

    1)第一次握手

    MSS值存放在可选项Options中,可以看到其值为65475字节。

    总结:第一次握手,client向server发送SYN标志位,设定初始sequence number

    2)第二次握手

    总结:通过Flags标志位可以看到,server在确认收到数据的同时(设置ack bit位为1),也向client发送了自己的Seq(设置SYN bit位为1)

    3)第三次握手

    总结:第三次握手,客户端接收到SYN和ACK包,说明服务端已经收到客户端的数据,这个时候客户端也需要向服务端来确认已经收到数据(发送ACK确认包),客户端进入ESTABLISHED状态,服务端收到ACK确认包后也进入ESTABLISHED状态。到这里,三次握手结束,client与server连接成功,下面开始传送数据。

    3.观察发送数据过程

    1)client发起http(GET类型请求)

    我们可以很明显的看到,client端发起一次http请求,server端发送一次TCP请求,用于确认已收到该http请求。

    我们来看下该http请求的详细数据:

    可以看到,当前请求类型为HTTP,HTTP的下层协议为TCP。

    HTTP的request URI为我们的请求url。

    2)server返回响应值

    下面看下响应值的详细信息:

    4.四次挥手

    这里就看下client发送断开连接标志的TCP请求:

    后面的TCP信息就不再详述了。

    总结下四次挥手的过程:

    * client发送FIN标志,表示数据已经传送完毕,请求断开连接,此时client进入FIN_WAIT1状态,此时client不能再发送数据,但是能够发送ack数据到server;

    * server接收到FIN标志,发送ack进行确认,server进入CLOSE_WAIT状态;

    * server数据发送完成时,发送FIN标志给client,server进入LAST_WAIT状态,然后断开TCP会话连接,释放占用的服务端资源信息;

    * client接收到FIN标志,返回ack进行确认,进入TIMED_WAIT状态,client在该状态下,等待一段时间后,没有数据到来,就认为server已经进入CLOSED状态,则client此时也断开TCP会话连接,释放资源。    

总结:

    最后再配上一张全图来整体展示下TCP连接、发送数据、断开连接的全过程

发布了124 篇原创文章 · 获赞 126 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_26323323/article/details/104335049