首页 > 其他分享 >TCP的三次握手和四次挥手分析

TCP的三次握手和四次挥手分析

时间:2023-05-05 23:47:18浏览次数:55  
标签:seq ack 握手 TCP ACK 四次 报文 服务端 客户端

一、tcp报文格式

主要关注的字段为:

  • 源端口号(Source Port),目的端口号(Destination Port)
  • 序列号seq(Sequence Number)
  • 确认号ack(Acknowledgment Number)
  • 标志位:ACK,SYN,FIN

二、三次握手

  1. 客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=x,发送给服务端。发送完毕后,客户端进入SYN_SENT状态
  2. 服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=x+1,随机产生一个序号值seq=y,发送给客户端。发送完毕后,服务端进入SYN_RCVD状态
  3. 客户端收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,seq=x+1,ack=y+1,并将该数据包发送给服务器端。客户端进入ESTABLISHED状态。服务器收到ack=y+1后,服务器端进入ESTABLISHED状态,完成三次握手

三、四次挥手

  1. 客户端发起挥手请求,向服务端发送报文(FIN=1,seq=u)。发送完毕后,客户端进入FIN_WAIT_1状态,这表示客户端没有数据要发送给服务端了
  2. 服务端收到了客户端发送的FIN报文后,回复报文(ACK=1,ack=u+1,seq=v)。服务端进入CLOSE_WAIT状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认报文后,进入FIN_WAIT_2状态,等待服务端的FIN报文
  3. 服务端没有要发的数据后,发送连接释放报文(FIN=1,ACK=1,seq=w,ack=u+1)。发送后,进入LAST_ACK状态,等待客户端确认
  4. 客户端回复确认报文(ACK=1,seq=u+1,ack=w+1) 。发送后,客户端进入TIME_WAIT状态,经过2MSL后,进入CLOSED状态。服务端收到确认报文后,进入CLOSED状态

四、抓包验证

server端代码

public class SocketServerTest {

    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(9999);

        while (true) {
            Socket socket = serverSocket.accept();
            handle(socket);
        }
    }

    private static void handle(Socket socket) {
        byte[] data = new byte[32];
        try {
            InputStream in = socket.getInputStream();
            while (true) {
                int len = in.read(data);
                if (len == -1) {
                    break;
                }
                System.out.println(new String(data, 0, len));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

client端代码

public class SocketTest {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 9999);
        socket.getOutputStream().write("hello".getBytes());
        socket.close();
    }
}

wireshark抓包

握手流程

  1. 客户端发送:SYN=1,seq=1819321381
  2. 服务端发送:SYN=1,ACK=1,ack=1819321382,seq=3973019899
  3. 客户端发送:ACK=1,ack=3973019900,seq=1819321382

挥手流程

  1. 客户端发送(ack是对上个报文的回复):FIN=1,seq=1819321387
  2. 服务端发送:ACK=1,ack=1819321388,seq=3973019900
  3. 服务端发送:FIN=1,ACK=1,seq=3973019900,ack=1819321388
  4. 客户端发送:ACK=1,ack=1819321388,seq=3973019901

五、参考

https://blog.csdn.net/Ethan_199402/article/details/107664562
https://www.jianshu.com/p/3ab3ac72a45e

标签:seq,ack,握手,TCP,ACK,四次,报文,服务端,客户端
From: https://www.cnblogs.com/wusanga/p/17375560.html

相关文章

  • javaNIO创建tcp服务器时的重要点
    在使用NIO创建非阻塞tcp服务器时,几个容易出现问题的点,如下代码注释所示:packagenet.yury.nio;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.CharBuffer;importjava.nio.channels.*;importjava.nio.charse......
  • 【C# TCP】
    https://www.cnblogs.com/yilezhu/p/12045018.html  https://blog.51cto.com/u_11990719/3112576 https://blog.csdn.net/lgj123xj/article/details/129868074https://blog.51cto.com/u_11990719/3112576 传输层TCP这里的TCP指的是传输层TCP,双方约定好协议内容,通过Soc......
  • 练习——简单的TcpCS了解基本概念
    packagecom.net;importjava.io.IOException;importjava.io.OutputStream;importjava.net.*;//客户端@SuppressWarnings({"all"})publicclassTCPClient_{publicstaticvoidmain(String[]args){Socketsocket=null;OutputS......
  • 河北稳控科技多通道振弦传感器无线采集仪发送数据到 TCP 服务器及远程修改参数
    河北稳控科技多通道振弦传感器无线采集仪发送数据到TCP服务器及远程修改参数 1、发送数据到TCP服务器参数配置(下列参数位于【参数配置】区域内的【自动模式参数】和【GPRS】面板内)数据发送方式:GPRSTCP数据包协议:字符串1.0TCP相关的其它参数可不进行配置,使用我们......
  • 多通道振弦传感器无线采集仪发送数据到 TCP 服务器及远程修改参数
     多通道振弦传感器无线采集仪发送数据到TCP服务器及远程修改参数1、发送数据到TCP服务器参数配置(下列参数位于【参数配置】区域内的【自动模式参数】和【GPRS】面板内)数据发送方式:GPRSTCP数据包协议:字符串1.0TCP相关的其它参数可不进行配置,使用我们已经为设备......
  • TCP三次握手/四次挥手详解
    2009-11-2611:23TCP三次握手/四次挥手详解(转)TCP(TransmissionControlProtocol)传输控制协议TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:位码即tcp标志位,有6种标示:SYN(synchronous建立联机)ACK(acknowledgement确认)PSH......
  • TCP三次握手和四次挥手详解
    在三次握手发送的数据包中有两个ACK值(Acknowledgement),人们习惯一个大写,一个小写来加以区分。其实ACK也好,ack也好,只不过是个代号而已,叫他张三也行,叫他李四也没事,没有任何影响,因为咱们不会改动那个东西。就算是把名字记反了,对咱们也没有任何影响,大家知道三次握手的数据包里有这么......
  • CS144 计算机网络 Lab3:TCP Sender
    前言在Lab2中我们实现了TCPReceiver,负责在收到报文段之后将数据写入重组器中,并回复给发送方确认应答号。在Lab3中,我们将实现TCP连接的另一个端点——发送方,负责读取ByteStream(由发送方上层应用程序创建并写入数据),并将字节流转换为报文段发送给接收方。代码实现TCPSe......
  • 30张图说清楚 TCP 协议
    大家好,我是风筝前两天分享了20张图说清楚IP协议今天,继续来网管的自我修养之TCP协议,这可是除IP协议外另一个核心协议了。TCP协议是网络传输中至关重要的一个协议,它位于传输层。向上支持FTP、TELNET、SMTP、DNS、HTTP等常见的应用层协议,向下要与网络层的IP协议相互配合,实现......
  • Redis WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/s
    RedisWARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/somaxconnissettothelowervalueof128. 内核参数默认128,对于负载很大的服务是不够的。改为2048或者更大echo2048> /proc/sys/net/core/somaxconn  系统重启后失效v......