TCP为什么三次握手?

这篇具有很好参考价值的文章主要介绍了TCP为什么三次握手?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:公众号 小林coding

常见回答:三次握手保证双方都具有接受和发送数据的能力。

主要原因:

1. 防止重复历史连接的初始化

2.同步双方初始序列号

3.避免资源的浪费

1. TCP为什么三次握手?

1.1  防止重复历史连接的初始化

TCP为什么三次握手?

序列号seq标记已发送数据的位置,确认号ack表示数据已接受,期望下一次数据序列号seq = ack

当因为网络拥塞导致超时重传建立连接的请求:设两次请求seq分别为:100, 200,在第二次请求发送后,客户端记录seq = 200, 即使网络恢复旧请求成功得到响应,此时ack = 101, 在客户端处校验不通过,发送RST终止这次连接。

如果采用两次握手:(中间绿色的服务端发送数据就被浪费,并且需要进行连接的销毁

TCP为什么三次握手?

 1.2 同步双方初始序列号

使用序列号可以保证数据的发送是有序的,同时记录已发送数据的位置,便于对比请求响应ack确定下一次发送数据的位置。

在三次握手的情况下,双方都对请求作出响应,表示数据接受,初始化发送数据的序列号;保证双方都进入数据可发送和接受的状态。

其中的四次握手,说的服务端响应阶段需要发送标志位:SYN, ACK,SYN用于初始化序列号,ACK表示确定数据接受成功;而最优的三次握手中,将这两个阶段放到一起,减少一次请求

3.其他问题

3.1 为什么客户端和服务端的初始化序列号不同?

可以注意到,在三次握手的建立过程中,很多情况下客户端的seq = x, 而服务端的序列号 seq = y

这样做的原因为了防止历史报文被下一个相同的四元组(tcp连接)接收

服务端和接收端中分别维护窗口大小,用于接收数据;如果使用不同的seq, 可以保证及时连接重置,旧的历史数据也很大程度不会落入接收窗口中,不会使数据污染。

假设每次初始化序列号都是0:

TCP为什么三次握手?

 

3.2 为什么要在传输层分片?

MTU:网络中最大数据包长度, 包括:IP头 + TCP头 + 数据报,以太网一般1500

MSS:最大数据报长度

当数据报超过MSS的时候进行数据分片。

如果在IP中进行分片,网络层中不包含重传机制,一旦某一个分片丢失,会导致这次请求的所有数据都要重传。

3.3 SYN攻击

        在TCP 连接建立是需要三次握手,假设攻击者短时间伪造不同 IP 地址的 SYN 报文,服务端每接收到一个 SYN 报文,就进入SYN_RCVD 状态,但服务端发送出去的 ACK + SYN 报文,无法得到未知 IP 主机的 ACK 应答,久而久之就会占满服务端的半连接队列,使得服务器不能为正常用户服务。

4、四次挥手

        进入连接断开阶段:

        第一次:客户端数据发送结束,发送FIN, 服务端接受后进入close_wait状态

        第二次:服务端响应客户端断开连接的请求

        第三次:服务端接收数据结束,发送FIN, 客户端接收后进入time_wait状态

        第四次: 客户端响应服务端请求,发送ack, 在time_wait阶段下等待2MSL时间;如果这个时间间隔内没有收到服务端的请求,进入close状态

主动关闭连接的,才有time_wait状态

相比于三次握手,这里的FIN 和 ACK需要分开,表示服务端仍可以接受数据;因此需要四次挥手

4.1 为什么需要2MSL

什么是MSL: 是报文段在网络中传输的最长时间;超过这个时间,就会被丢弃

2MSL:客户端发送确认报文ACK + 等待服务端请求(如果ACK丢失,重新发送FIN)两次请求的最长存活时间;当超过这个时间,表示报文发送成功。

4.2 为什么要有TIME_WAIT状态

1. 防止历史数据被后面相同的四元组(TCP连接)接收。假设第一次TCP连接中seq = 100, 整个过程中发送一次seq = 101的报文但是因为网络产生延迟,在TCP关闭前也没有成功接收。再重新建立一个TCP连接使用seq = 100, 此时上一次连接中的报文到达,并且接收窗口 [100, x]可以接受这次的数据;导致了新的连接接受了上一次的旧数据。

TCP为什么三次握手?

 

2. 保证接收数据方能够正常断开;如果没有2MSL, 当客户端发送ACK后直接进入关闭状态,如果ACK丢包,导致服务端重新发送FIN, 此时没有接收方,服务端一直没有断开连接


后续LInux中的看不懂。。。慢慢看吧,哎文章来源地址https://www.toymoban.com/news/detail-426773.html

到了这里,关于TCP为什么三次握手?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 说说TCP为什么需要三次握手和四次挥手?

    三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包 主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备 过程如下: 第一次握手:客户端给服务端发一个 SYN 报文,并指明

    2024年04月08日
    浏览(42)
  • TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以?

    TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以? 1. 什么是TCP协议? TCP:Transmission Control Protocol翻译过来就是传输控制协议,TCP协议是一个面向连接的、可靠的、基于字节流的传输层协议 RFC 793对TCP连接的定义 Connections: The reliability and flow control mechanisms descri

    2024年02月16日
    浏览(36)
  • TCP为什么要三次握手,而不是两次或四次?

    TCP连接时用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket,序列号和窗口大小 称为连接。 以上三个方面分析三次握手原因: 首要原因为了防止旧的重复连接初始化造成混乱 网络堵塞情况下,如果一个旧的SYN报文比新的SYN报文早到达了服务端,

    2023年04月26日
    浏览(82)
  • (学习笔记-TCP连接建立)TCP 为什么是三次握手?不是两次、四次?

    常规回答:“因为三次握手才能保证双方具有接收和发送的能力” 三次握手的 首要原因是为了防止旧的重复连接初始化造成混乱 。 假设:客户端先发送了SYN(seq=90)报文,然后客户端宕机了,而且这个SYN报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向

    2024年02月17日
    浏览(36)
  • TCP为什么是三次握手和四次挥手以及可能出现的问题

    如果是4次,多了一次没啥意义还慢了,如果是两次握手逻辑可能存在下列问题: (这两个方面也可以理解为握手过程中可能出现的问题) 不可靠 TCP协议是可靠的 ,那么 建立的连接也需要确保是双向,可靠的 ; 根据连接过程分析,只有一方收到了另一方的ack确认报文,才能证

    2024年02月03日
    浏览(38)
  • TCP为什么需要三次握手进行连接,二次或四次不可以吗?

    为了确认双方具有接收和发送的能力。 1. 可以阻止重复历史连接的初始化(主要原因)。 2. 可以同步双方的初始序列号。 3. 可以避免资源的浪费。 1. 为了防止旧的重复连接初始化造成混乱。 当客户端发送了一个 SYN 报文后,突然宕机了,并且这个 SYN 报文还被网络阻塞了

    2024年02月16日
    浏览(43)
  • “为什么是三次握手”与“为什么是三次握手,却是四次挥手”其实是不同的问题

    “为什么是三次握手?” 这个问题言下之意其实在问:“为什么不是0次、1次、2次、4次甚至更多次握手”。 确保双方的 发送能力 和 接收能力 都是好的 。 该回答下的一评论:其实很简单, 1.a-b, 这个时候没有任何状态, 2. b-a, b给a发东西, 说明收到了a的东西, 证明了a的

    2024年02月10日
    浏览(40)
  • 为什么是三次握手和四次挥手

    因为这是双方都有收发的最小次数 握手的目的:确认网络好着没,对方好着没 确认双方主机是否健康(双方) 验证双方是否具有全双工。 比如发送数据不是为了对方接受,而是为了证明自己能够发送数据。 一次握手,服务端知道自己能收; 两次握手,客户端知道自己能够

    2024年02月02日
    浏览(47)
  • TCP为什么需要3次握手?

    一、3次握手过程 客户端向服务端发送一个表示建立连接的SYN报文段,服务端从IP数据报中提取出TCP SYN报文段,为该TCP连接分配需要的缓存和变量,并向客户端发送表示允许连接的报文段ACK。客户端在收到ACK报文段之后,也要给该连接分配缓存和变量,客户端向服务器再发送

    2024年04月26日
    浏览(30)
  • 笔记:TCP握手为什么是3次而不是2次?

    这个问题比较常见,这里简单总结一下。 一、两次握手建立连接:流程说明: 1)客户端发送SYN。 2)服务端收到SYN请求后,服务端回复SYN+ACK,然后进入已连接状态。 3)客户端收到SYN+ACK回复后,进入已连接状态。 二、两次握手建立连接:存在的问题 若客户端发送SYN后,没

    2023年04月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包