美文网首页
2020-02-07-TCP的连接和释放

2020-02-07-TCP的连接和释放

作者: 耿望 | 来源:发表于2020-02-07 18:16 被阅读0次

这里使用Java语言简单实现了客户端和服务端通信,使用Wireshark抓包工具抓取了过程中的网络包。

客户端IP地址:192.168.0.107
服务端IP地址:193.112.193.132
端口:10100

TCP报文

首先要看懂TCP的报文,一个TCP连接首先要有两个IP地址和两个端口号,分别唯一标识了客户端和服务端进程。构造一个Socket也需要传入IP地址和端口号。

1. 报文首部

下面是用Wireshark抓包工具看到的报文信息:

Transmission Control Protocol, Src Port: 54438, Dst Port: 10100, Seq: 157, Ack: 1, Len: 0
    Source Port: 54438
    Destination Port: 10100
    [Stream index: 15]
    [TCP Segment Len: 0]
    Sequence number: 157    (relative sequence number)
    Sequence number (raw): 1837642959
    [Next sequence number: 158    (relative sequence number)]
    Acknowledgment number: 1    (relative ack number)
    Acknowledgment number (raw): 2818203645
    0101 .... = Header Length: 20 bytes (5)
    Flags: 0x011 (FIN, ACK)
    Window size value: 517
    [Calculated window size: 132352]
    [Window size scaling factor: 256]
    Checksum: 0x4423 [unverified]
    [Checksum Status: Unverified]
    Urgent pointer: 0
    [Timestamps]

报文首部由几个重要的部分组成:

  1. 源端口 Source Port
  2. 目的端口 Destination Port
  3. 数据长度TCP Segment Len
    Segment Len代表了这个包的大小,也就是这个报文的数据长度。这个数值会影响下一个报文的序列号。
    假如当前Seq=1, Len=7,那么下一个报文Seq=8。而且SYN和FIN本身会消耗一个序列,虽然它们的包大小是0,但是因为这两种报文都需要确认ACK,所以会导致序列加1。
  4. 序列号 Sequence number
  5. 确认号 Acknowledgment number
  6. 标志位 Flags
    TCP有6种标志位:SYN(synchronous建立连接),
    ACK(acknowledgement 确认), PSH(push传送)
    FIN(finish结束), RST(reset重置), URG(urgent紧急)
  7. 窗口 Window size
  8. 校验和 Checksum
  9. 紧急指针 Urgent pointer


    tcp.png

2. 时序图

TCP的连接过程是这样的:

  1. 客户端发出一个连接请求,SYN=1的报文;
  2. 服务端收到请求后发出一个ACK=1的确认报文;
    此时服务端确认客户端的发送能力是正常的。
  3. 客户端收到确认报文后发出ACK=1的确认报文;
    此时客户端确认自身的收发能力是正常的,服务端的收发能力也是正常的。
    服务端收到ACK后也确认自身的收发能力正常,客户端收发能力正常。
    于是建立了一个稳定连接。
    TCP的释放过程是这样的:
  4. 客户端发出一个FIN=1的结束报文;
    此时客户端已经关闭连接,不会再发送数据了。
  5. 服务端收到报文后发出一个ACK=1的确认报文;
    此时服务端可以继续发送数据,直到上层确认数据发送完毕。
  6. 服务端发出一个FIN=1的结束报文;
    此时服务端也关闭,不会再发送数据。
  7. 客户端收到报文后发出一个ACK=1的确认报文。
    客户端发出确认报文后,为了防止数据丢失,会再等待2MSL,然后完全关闭连接。
    服务端收到确认报文后,也会完全关闭连接。


    TCP的连接和释放.png

代码实现

这里使用Java语言实现了客户端和服务端的Socket通信

服务端

服务端写了一个线程,通过ServerSocket不停去监听,接受和处理客户端请求,没有请求时线程阻塞等待。
下面是核心代码,没有请求时会在accept()方法里面阻塞,当请求的内容里面包含"finish"字段会退出循环,线程终止。

            ServerSocket serverSocket = new ServerSocket(PORT);
            while(!finish) {
                socket = serverSocket.accept();
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String lineString = null;
                while ((lineString = bufferedReader.readLine()) != null) {
                    System.out.println(lineString);
                    if ("finish".equals(lineString)) {
                        finish = true;
                        break;
                    }
                }
            }

客户端

客户端发起一次请求,建立连接,
然后写入10个字符串,休眠2秒钟,再继续写入10个字符串,
然后休眠2秒钟,写入"finish"字段后主动关闭socket,释放连接。

        OutputStream outputStream = null;
        Socket socket = null;
        try {
            socket = new Socket(IP_STRING, PORT);
            System.out.println("new Socekt port=" + socket.getPort());
            outputStream = socket.getOutputStream();
            for (int i = 0; i < 10; i++) {
                String contentString = "first" + i + "\n";
                outputStream.write(contentString.getBytes());
            }
            Thread.sleep(2000);
            for (int i = 0; i < 10; i++) {
                String contentString = "second" + i + "\n";
                outputStream.write(contentString.getBytes());
            }
            Thread.sleep(2000);
            outputStream.write("finish".getBytes());

参考:

https://blog.csdn.net/hnjb5873/article/details/48657001
https://blog.csdn.net/qzcsu/article/details/72861891
https://zhuanlan.zhihu.com/p/53374516

相关文章

  • 2020-02-07-TCP的连接和释放

    这里使用Java语言简单实现了客户端和服务端通信,使用Wireshark抓包工具抓取了过程中的网络包。 客户端IP...

  • Socket连接和释放

    socket中TCP的三次握手建立连接详解 我们知道tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下...

  • TCP的连接和释放

    连接状态: 1、三次握手(建立连接) TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立...

  • 计算机网络

    1、TCP的连接和释放连接? 连接建立的过程: ·Client向Server发送连接请求 ·Server接收到Cl...

  • TCP协议的连接和释放

    TCP传输控制协议,是一个面向连接的协议。在运用此协议进行数据传输前都会进行连接的建立工作(三次握手);当数据传输...

  • TCP连接的建立和释放

    本文主要探究tcp连接建立和释放过程中的状态演变 TCP连接的建立 其实这张图已经说得很清楚了,客户端应用程序调用...

  • 在进行数据库编程时,连接池有什么作用?

    由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连...

  • TCP/IP协议--TCP三次握手建立连接

    TCP连接 TCP是面向连接的协议,它基于传输连接来传送TCP报文段 TCP传输连接的建立和释放是每一次面向连接的...

  • SYN-Flood攻击解决办法?

    参考:SYN Flood攻击与防御方法 1. 无效连接监视释放 这种方法不停监视系统的半开连接和不活动连接,当达到...

  • TCP三次握手四次挥手详解

    TCP的运输连接管理 TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放是每一次面...

网友评论

      本文标题:2020-02-07-TCP的连接和释放

      本文链接:https://www.haomeiwen.com/subject/ljlmxhtx.html