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

TCP-三次握手

时间:2022-10-28 14:57:16浏览次数:59  
标签:握手 SYN TCP 连接 三次 报文 服务端 客户端

1、三次握手的概念

TCP三次握手是浏览器和服务器建立连接的方式,目的是为了使二者能够建立连接,便于后续的数据交互传输。
第一次握手:浏览器向服务器发起建立连接的请求
第二次握手:服务器告诉浏览器,我同意你的连接请求,同时我也向你发起建立连接的请求
第三次握手:浏览器也告诉服务器,我同意建立连接。
至此,双方都知道对方同意建立连接,并准备好了进行数据传输,也知道对方知道自己的情况。接下来就可以传输数据了

2、简单的示意图

一次握手:客户端发送带有 SYN 标志的连接请求数据包给服务端
二次握手:服务端发送带有 SYN+ACK 标志的连接请求和应答数据包给客户端
三次握手:客户端发送带有 ACK 标志的应答数据包给服务端(可以携带数据了)

 

 

 3、详细分析

 

 

3-0、初始状态:
服务端监听某个端口,处于 LISTEN 状态。

3-1、客户端发送TCP连接请求
客户端会随机一个初始序列号seq=x(client_isn),
设置SYN=1 ,表示这是SYN握手报文。然后就可以把这个 SYN 报文发送给服务端了,表示向服务端发起连接,之后客户端处于 同步已发送 状态。

3-2、服务端发送针对TCP连接请求的确认
服务端收到客户端的 SYN 报文后,也随机一个初始序列号(server_isn)(seq=y)
设置ack=x+1, 表示收到了客户端的x之前的数据,希望客户端下次发送的数据从x+1开始。
设置 SYN=1 和 ACK=1。表示这是一个SYN握手和ACK确认应答报文。
最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 同步已接收 状态。

3-3、客户端发送确认的确认
客户端收到服务端报文后,还要向服务端回应最后一个应答报文,
将ACK置为 1 ,表示这是一个应答报文
ack=y+1 ,表示收到了服务器的y之前的数据,希望服务器下次发送的数据从y+1开始。
最后把报文发送给服务端,这次报文可以携带数据,之后客户端处于 连接已建立的状态。
服务器收到客户端的应答报文后,也进入连接已建立的状态

4、一些思考- 为什么会三次握手

原因主要有两个:
1、主要原因是为了防止历史连接

三次握手时,在网络拥堵等情况下,第一次握手的SYN包迟迟没能发送到服务端,那么客户端会连续发送多次 SYN 建立连接的报文,那么就可能出现一个「后发送SYN 报文」比「早发送的 SYN 报文」 早到达了服务端;

那么此时服务端就会回一个 SYN + ACK 报文给客户端;

如果是两次握手连接,就不能判断当前连接是否是历史连接,导致错误。

三次握手时,客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送 RST 报文给服务端,中止这一次连接。

2、三次握手可以避免资源浪费

如果只有「两次握手」,当客户端的 SYN 请求连接在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN ,

如果是三次握手,第三次握手时服务器可以得到客户端的ack,知道连接已成功建立。

如果没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的 ACK 确认信号,所以每收到一个 SYN 就只能先主动建立一个连接,如果客户端的 SYN 阻塞了,重复发送多次 SYN 报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。

a:为了防止服务器端开启一些无用的连接增加服务器开销
第一次握手客户端发送的TCP报文,服务端成功接收;然后第二次握手,服务端返回一个确认收到消息的TCP报文,但这个报文因为某些原因丢失了,那么客户端就一直收不到这个TCP报文,客户端设置了一个超时时间,超过了就重新发送一个TCP连接请求,那么如果没有第三次握手的话,服务端是不知道客户端是否收到服务返回的信息的,这样没有给服务器端一个创建还是关闭连接端口的请求,服务器端的端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。那么服务器端上没有接收到请求数据的上一个端口就一直开着,长此以往,这样的端口多了,就会造成服务器端开销的严重浪费。

b:防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
已经失效的客户端发出的请求信息,由于某种原因传输到了服务器端,服务器端以为是客户端发出的有效请求,接收后产生错误。

c:总结
也可以这样理解:“第三次握手”是客户端向服务器端发送数据,这个数据就是要告诉服务器,客户端有没有收到服务器“第二次握手”时传过去的数据。若发送的这个数据是“收到了”的信息,接收后服务器就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口。由此减少服务器开销和接收到失效请求发生的错误。(如果第三次握手失败的话,那服务端就关闭连接)

 

标签:握手,SYN,TCP,连接,三次,报文,服务端,客户端
From: https://www.cnblogs.com/baoxinyu/p/16836068.html

相关文章

  • TCP 端来链接为什么一定要等2MSL
    我们知道tcp传输中需要三次握手和四次挥手2MSL发生在挥手阶段原因保证可靠的TCP通讯安全的断开保证旧的的消息在网络消失安全断开我们知道一个IP包最大的声明......
  • TCP与UDP的区别
    引言网络协议是每个前端工程师都必须要掌握的知识,TCP/IP中有两个具有代表性的传输层协议,分别是TCP和UDP,本文将介绍下这两者以及它们之间的区别。一、TCP/IP网络模型......
  • TCP链接详解
    一.TCP协议传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。基于流的方式;面向连接;(在通信之前要通过......
  • 重新思考TCP三次握手,两次握手的缺点
    两次握手也能保证有序可达两次握手在CS架构中是能保证有序、可达的,因为客户端在收到服务器的确认后,双方知道客户端下一次消息的正确序号,客户端到服务器的单向连接就......
  • http keepalive 和 tcp keepalive 的区别
    HTTPkeep-alive和TCPkeepalive的区别首先,二者是完全不同的东西:HTTPkeep-alive:是应用层(用户态)实现,称为HTTP长连接;TCPkeepalive,是传输层TCP(内核态)实现,称为TCP保活......
  • TCP进程与线程的区别
    1、进程和线程的区别:答:线程是指进程内的一个执行单元,也是进程内的可调度实体。与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。(2)......
  • zbx_tcp_listen() fatal error:unable to serve on any address [[-]:10070]
    Zabbix服务器未启动侦听器失败:zbx_tcp_listen()致命错误:无法在任何地址上提供服务[[-]:10070]日志错误:服务状态以及尝试启动时:进程正在运行:但是服务仍然停止: ......
  • 第三次实验
    实验五hpp1#pragmaonce23#include<iostream>4#include<iomanip>5usingnamespacestd;6classinfo7{89public:10info(stringnickna......
  • tcp:协议流程
    三次握手四次挥手进入listen状态客户端和服务的还没有建立连接前,都处于CLOSED状态并且在开始之前需要创建TCB(传输控制块)、直到TCB创建完成后,才进入LISTEN状态开始......
  • TCP/IP网络编程之地址族与数据序列
    分配IP地址和端口号IP是InternetProtocol(网络协议)的简写,是为收发网络数据而分配给计算机的值。端口号并非赋予计算机的值,而是为区分程序中创建的套接字而分配给套接字的......