首页 > 其他分享 >TCP三次握手

TCP三次握手

时间:2024-02-19 16:36:02浏览次数:25  
标签:ACK 握手 SYN TCP 三次 报文 服务端 客户端

一、TCP 三次握手

TCP 协议工作在 OSI 的传输层,保障网络数据包传输的可靠性。TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。

TCP 是面向连接的协议,使用 TCP 前必须先建立连接,建立连接是通过三次握手进行的。三次握手的过程如下图所示:

  • 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。

  • 客户端会随机初始化一个序列号,此序列号置于 TCP 首部的 “序列号” 字段中,同时把 SYN 标志位置为1,表示SYN报文。接着把SYN报文发送给服务端,表示向服务端发起连接,该报文不包含数据,之后客户端处于SYN_SENT状态。

  • 服务端收到客户端的SYN报文后,首先服务端随机初始化自己的序列号,此序列号置于TCP首部的“序列号”字段中,接着将收到的客户端序列号+1,置于TCP首部的“确认应答号”字段中,然后把SYN和ACK标志位置为1。最后把该报文发送给客户端,该报文不包含数据,之后服务端处于SYN_RCVD状态。

  • 客户端收到服务器SYN+ACK报文后,首先客户端将收到的服务端序列号+1,置于TCP首部的“确认应答号”字段中,将ACK标志位置为1。将此报文发送给服务端,这次报文可以携带数据,之后客户端处于ESTABLISHED状态。

  • 服务端收到客户端的ACK报文后,也进入ESTABLISHED状态。

  • 三次握手完成,双方都处于ESTABLISHED状态,此时连接已建立完成,客户端和服务端可以相互发送数据。

二、TCP 三次握手丢失的情况

1、第一次握手丢失,也就是客户端发送的SYN报文不能到达服务端。

此时客户端处于 SYN_SENT 状态,由于服务端没有收到该 SYN 报文,客户端也不会收到服务端的SYN+ACK报文,就会触发超时重传机制,重传SYN报文,重传的SYN报文的序列号不变。

2、第二次握手丢失,也就是服务端发送的SYN+ACK报文不能到达客户端

  • 客户端收不到服务端的SYN+ACK报文,会认为自己的SYN报文丢失了,那么就会超时重传SYN报文。

  • 服务端收不到客户端的ACK报文,会认为自己的SYN+ACK报文丢失了,也会重传该报文。

3、第三次握手丢失,就是服务端没有收到ACK报文。

此时服务端认为自己的SYN+ACK报文丢失,会进行超时重传。客户端不会重传ACK报文。

三、三次握手的原因
  • 阻止重复历史连接的初始化

  • 同步双方的初始序列号

  • 避免资源浪费

有这样一种场景,客户端发送SYN报文给服务端时,由于某种原因服务端没有收到该SYN报文,客户端重新发送新的SYN报文,而不是重传之前的SYN报文。当服务端先收到之前的SYN报文,会回复给客户端SYN+ACK报文,当客户端收到该SYN+ACK报文后,发现并不是自己期望收到的报文,客户端会发送给服务端RST报文,服务端收到RST报文,会释放该连接。

而如果是两次握手,服务端收到客户端的SYN报文,不管是旧的还是新的,服务端都会建立连接。

四、TCP 头部格式

标签:ACK,握手,SYN,TCP,三次,报文,服务端,客户端
From: https://www.cnblogs.com/zbc230/p/18021409

相关文章

  • TCP跟UDP区别
    TCP协议跟UDP协议都存在于传输层,都在程序之间传输数据。、 传输控制协议(TCP):TCP(传输控制协议)定义了两台计算机之间进行可靠的传输而交换的数据和确认信息的格式,以及计算机为了确保数据的正确到达而采取的措施。协议规定了TCP软件怎样识别给定计算机上的多个目的进程如何对分组重......
  • 《程序是怎么跑起来》第三次观后感(8 9章)
    第八章讲的是源文件和源代码。源代码,记得有几次上机的时候,我们的老师让写书中的习题,我想那就是源代码。可是我不知道什么源代码,我自己理解的意思是最初的代码(在计算机中,源代码的定义为:某种编程语言编写的程序叫做源代码)。在读后第八章后,我有大概明白了,不过我们接触源代码还是挺多......
  • Http和Tcp的区别
    Http和Tcp的区别1.HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。2.HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)1、简单快速:客户向服务器请求服务时,只需......
  • ZLmediakit的TCP主动接收RTP数据
    当我们使用openRtpServer接口的时候,一般都是别人主动向port或者默认端口(默认1000)上推数据;这种属于ZLM的socket被动接收连接(TCP),ZLM的RTPserver作为服务端,监听端口,有别人过来链接之后,握手建立连接,传输数据;如果我们想主动去链接对方,告诉对方给我发数据要怎么处理呢?首先,发送数据端......
  • tcp ip socket seer agv 连接
    Dotnet.Seer/SeerSocket.csusingSystem.Net;usingSystem.Net.Sockets;usingSystem.Runtime.InteropServices;namespaceSeer.SeerSocket;publicstructSeerMessageHead{publicbytesync;//0x5Apublicbyteversion;//0x01publicushortnumbe......
  • TCP和UDP面试题提问
    @目录TCPUDP总结应用TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用。TCPTCP是面向连接的协议,它在数据传输之前需要在发送端和接收端建立一条连接。TCP提供可靠的数据传输,它使用确认和重传机制来确保数据的可靠性和完整性。T......
  • Jmeter进行TCP压力测试
    1.启动Jmeter后,在左侧测试计划节点,右键“添加”-》“线程”-》“线程组”2.在新增的线程组节点上。右键“添加”-》“取样器”-》“TCP取样器”3.在线程组节点上,再右键“添加”-》“监听器”-“察看结果树”构建完成后如下图:  4.设置并发相关参数是在线程组中,线程数即为并......
  • TCP拥塞控制算法初步介绍
    TCP拥塞控制算法初步介绍写得较为浅显,若有错误的地方还请指正.一、TCP拥塞控制:让发送方自己感知网络的拥塞程度并限制其能向链接发送流量的速率.限制方法:设置LastByteSent-LastByteAcked<=min{cwnd,rwnd}即已发送而未被确认的流量小于等于两个窗口长其中,cwnd......
  • PowerShell中,可以使用以下命令来发送和接收TCP数据 发送IPv4 TCP数据 接收IPv4 TCP
    在PowerShell中,可以使用以下命令来发送和接收TCP数据:发送IPv4TCP数据:CopyCode$remoteIPAddress="192.168.0.1"$remotePort=80$tcpClient=New-ObjectSystem.Net.Sockets.TcpClient($remoteIPAddress,$remotePort)$networkStream=$tcpClient.GetStream()$bytes......
  • Java之UDP,TCP的详细解析
     练习四:文件名重复publicclassUUIDTest{publicstaticvoidmain(String[]args){Stringstr=UUID.randomUUID().toString().replace("-","");System.out.println(str);//9f15b8c356c54f55bfcb0ee3023fce8a}}```publicclassClient{public......