zoukankan      html  css  js  c++  java
  • 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手

    【摘要】本文重点分析计算机网络中TCP协议中的握手和挥手的过程。

    【前提说明】

    前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需要复习一下网络知识,于是就有这篇博文的诞生。当然网上关于TCP相关的知识点也是芸芸,闲着无事也可以多google深入理解一下,本文重点在分析TCP协议中的握手和挥手的过程。

    【抓包前准备】

    既然要抓包,我的装备是个人电脑,操作系统是Mac OS。抓包工具是wireshark,至于怎么安装和一些基本的操作,可以点击参考这篇文章。

    用本地电脑模拟server和client,都是localhost的地址,但是我选择的是不同的端口进行标识。server的端口号:12345;client的端口号:50784。因为是用的本机做的实验,所以wireshark监听的不是网卡而是Loopback:lo0,如图所示:

    以下是我模拟client和server的代码:

    1)server端

    -Python 代码
    01
    #! /usr/bin/python
    02
    # -*- coding: utf-8 -*-
    03
     
    04
    import socket
    05
     
    06
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    07
     
    08
    server_address = ('127.0.0.1', 12345)
    09
    print "Starting up on %s:%s" % server_address
    10
    sock.bind(server_address)
    11
     
    12
    sock.listen(1)
    13
     
    14
    while True:
    15
        print "Waiting for a connection"
    16
        connection, client_address = sock.accept()
    17
     
    18
        try:
    19
            print "Connection from", client_address
    20
     
    21
            data = connection.recv(1024)
    22
            print "Receive '%s'" % data
    23
        finally:
    24
            connection.close()

    2)client端-Python 代码

    01
    # /usr/bin/python
    02
    # -*- coding: utf-8 -*-
    03
     
    04
    import socket
    05
     
    06
    def check_tcp_status(ip, port):
    07
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    08
     
    09
        server_address = (ip, port)
    10
        print 'Connecting to %s:%s.' % server_address
    11
        sock.connect(server_address)
    12
     
    13
        message = "I'm TCP client"
    14
        print 'Sending "%s".' % message
    15
        sock.sendall(message)
    16
     
    17
        print 'Closing socket.'
    18
        sock.close()
    19
     
    20
     
    21
    if __name__ == "__main__":
    22
        print check_tcp_status("127.0.0.1", 12345)

    代码比较简单,就是模拟了一次链接,可以多次执行client,client只要链接成功就会发送一句话“I'm TCP client”,server一直死循环监听端口,并将接受到的信息打印到console中。

    【结果分析】

    看到上面的console输出之后,我们看一下wireshark抓到的结果:

    我用两种颜色标了出来,可以看到黄色框中的序号为1、2、3的三次通信过程其实就是我们说的三次握手;握手建立之后的序号为4、5、6便为传输数据的过程;而序号7、8、9、10就是我们所说的四次挥手的过程。

    我们再进一步细看下握手、挥手这俩过程。

    三次握手

     

    我们来总结一下握手的规律:

    • 第一次握手:建立链接。客户端发送链接的请求,发送SYN报文,将Seq设置为0。然后客户端就进入了SYN_SEND状态,等待服务器的确认。
    • 第二次握手:服务器收到客户端的SYN报文段。需要对这个SYN报文段进行确认,发送ACK报文,并将Ack设置为1。同时,自己也要发送SYN请求信息,将Seq设置为0,。服务器将上述的所有信息一并发送给客户端,此时服务器进入SYN_RECV状态。
    • 第三次握手:客户端收到服务器的ACK和SYN报文后,进行确认,然后将Ack设置为1,Seq设置为1,向服务器发送ACK报文段,这个报文段发送完毕之后,客户端和服务器都进入了ESTABLISHED状态。就此完成了TCP的三次握手。

    四次挥手

     

    接着总结下挥手的规律:

    • 第一次挥手:客户端想服务器发送一个FIN报文段,将设置Seq为15和Ack为1。此时客户端进入FIN_WAIT_1状态。这表示客户端没有数据要发送服务器了,请求关闭连接。
    • 第二次挥手:服务器收到了客户端发送的FIN报文段,向客户端回一个ACK报文段,Ack设置为16,Seq设置为1;服务器进入了CLOSE_WAIT状态,客户端收到服务器返回的ACK报文之后随即进入FIN_WAIT_2状态。
    • 第三次挥手:服务器会观察自己是否还有数据没有发送给客户端,如果有,先把数据发送给客户端,再发送FIN报文;如果没有,那么服务器直接发送FIN报文给客户端。请求关闭连接,同时服务器进入LAST_ACK状态。
    • 第四次挥手:客户端收到服务器发送的FIN报文,向服务器发送ACK报文,将Seq设置为16,Ack设置为2,然后客户端进入TIME_WAIT状态;服务器收到客户端的ACK报文之后就关闭了连接;此时,客户端等待2msl后依然没有收到回复,则证明服务器已正常关闭,客户端也可以关闭连接了。

    注意个规律: 每次一方返回ACK报文的时候,设置Ack=对方传来的Seq值+1。

    【理解TCP/IP模型】

    说完TCP协议之后,不能免俗的要聊一下TCP/IP协议模型,该模型是计算机网络的经典的模型了。该模型由OSI模型演化而来,由原来的7层简化为了5层,具体如下图所示:

    TCP/IP协议被称为传输控制协议/互联网协议,又称网络通讯协议(Transmission Control Protocol)。是由网络层的IP协议和传输层的TCP协议组成,是一个很大的协议集合。

    • 物理层和数据链路层没有定义任何特定协议,支持所有的标准和专用的协议。
    • 网络层定义了网络互联也就是IP协议,主要包括IP、ARP、RARP、ICMP、IGMP。
    • 传输层定义了TCP和UDP(User Datagram Protocol),我们会后面重点介绍一下TCP协议。
    • 应用层定义了HTTP(超文本传输协议)、FTP(文件传输协议)、DNS(域名系统)等协议。

    TCP/IP的网络模型分层思想算是非常有借鉴性的系统分层思想。映射到我们的软件系统上来看,其实我们的软件系统更多的时候也需要考虑分层,层次之间通过接口来交互。在严格的分层系统里,内部的层只对相邻的层次可见,这样就可以将一个复杂问题分解成增量步骤序列。由于每一层最多只影响两层,也给维护带来了很大的便利。

    参考资料:

    blog.csdn.net/zhzdeng/article/details/53490386

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    ZOJ 1002 Fire Net (火力网)
    UVa OJ 117 The Postal Worker Rings Once (让邮差只走一圈)
    UVa OJ 118 Mutant Flatworld Explorers (变体扁平世界探索器)
    UVa OJ 103 Stacking Boxes (嵌套盒子)
    UVa OJ 110 MetaLoopless Sorts (无循环元排序)
    第一次遇到使用NSNull的场景
    NSURL使用浅析
    从CNTV下载《小小智慧树》
    NSDictionary and NSMutableDictionary
    Category in static library
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/13025732.html
Copyright © 2011-2022 走看看