TCP三次握手中SYN,ACK,seq ack的含义

1.TCP 为什么三次握手而不是两次握手

1.防止已失效的连接请求又传送到服务器端,因而产生错误。

  不幸的是, 这种解释是不准确的, TCP 采用三次握手的原因其实非常简单, 远没有大部分博客所描述的那样云山雾绕。为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

位码即tcp标志位,有6种标示:

①  SYN(synchronous建立联机);

②  ACK(acknowledgement 确认)

③  PSH(push传送)

④  FIN(finish结束)

⑤  RST(reset重置)

⑥  URG(urgent紧急)

Sequence number(顺序号码) //Acknowledge number(确认号码)

第一次握手:主机A发送位码为SYN=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手,主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),SYN=1,ACK=1,随机产生seq number=7654321的包;

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ACK是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ACK=1,主机B收到后确认seq值与ACK=1则连接建立成功。

sequence number:表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。(注意这里使用的是“应该”。因为对于没有数据的传输,如ACK,虽然它有一个seq,但是这次传输在整个data stream中是不占位置的。所以下一个实际有数据的传输,会依旧从上一次发送ACK的数据包的seq开始)

acknowledge number:表示的是期望的对方(接收方)的下一次sequence number是多少。

注意SYN/FIN的传输,虽然没有data,但是会让下一次传输的packet seq增加一但是,ACK的传输,不会让下一次的传输packet seq加一

题外话

有一位读者关注到了三次握手中, 序列号变化的问题, 让笔者临时想起了曾经困扰自己的一个问题

为什么三次握手最后一次握手中, 在上面的示意图中回复的 seq = x+1 。

acknowledgement number 的作用是向对方表示,我期待收到的下一个序号。 如果你向对方回复了 ack = 31, 代表着你已经收到了序号截止到30的数据,期待的下一个数据起点是 31 。

TCP 协议规定SYN报文虽然不携带数据, 但是也要消耗1个序列号, 所以前两次握手客户端和服务端都需要向对方回复 x+1 或 y+1 。

值得注意的是, 如上图所说, 最后一次握手在默认不携带数据的情况下, 由于SYN 不是 1 , 是不消耗序列号的。 所以三次握手结束后, 客户端下一个发送的报文中 seq 依旧是 x+1, 示意图如下

注意到, 上图第四步发送的 seq 和第三次握手的 seq 是一样的, 体现了最后一次握手, 默认不消耗序列号的特点。

四次挥手

四次握手是指终止TCP连接协议时,需要在客户端和服务器之间发送四个包

第一次挥手:主动关闭方发送第一个包,其中FIN标志位为1,发送顺序号seq为X。

第二次挥手:被动关闭方收到FIN包后发送第二个包,其中发送顺序号seq为Z,接收顺序号ack为X+1。

第三次挥手:被动关闭方再发送第三个包,其中FIN标志位为1,发送顺序号seq为Y,接收顺序号ack为X。

第四次挥手:主动关闭方发送第四个包,其中发送顺序号为X,接收顺序号为Y。至此,完成四次挥手。

超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO.

深入讨论:

1、为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

建立连接时,ACK和SYN可以放在一个报文里来发送。而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2、为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

两个存在的理由:1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒被丢弃。

3、为什么必须是三次握手,不能用两次握手进行连接?

记住服务器的资源宝贵不能浪费!  如果在断开连接后,第一次握手请求连接的包才到会使服务器打开连接,占用资源而且容易被恶意攻击!防止攻击的方法,缩短服务器等待时间。两次握手容易死锁。如果服务器的应答分组在传输中丢失,将不知道S建立什么样的序列号,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

参考:https://blog.csdn.net/qq_25948717/article/details/80382766

TCP三次握手中SYN,ACK,seq ack的含义相关推荐

  1. TCP三次握手中,为什么需要第三次握手?

    为什么客户端A还要发送一次确认呢?(为什么需要第三次握手) 这主要是为了防止已失效的连接请求报文段突然又传送到了B(服务器端),因而产生错误. 所谓"已失效的连接请求报文段"是这样 ...

  2. TCP的三次握手各字段(ack,seq,ACK,SYN)是什么意思?

    什么是TCP的三次握手? 关于TCP的三次握手,很多博客回答上都已经说的比较明白了,往简单的说,就是互相建立连接,并且保证数据准确传输. TCP三次握手的过程 情景模拟 1.0 发送方:老铁,可以听得 ...

  3. Wireshark抓取TCP三次握手包

    TCP三次握手 TCP协议是一个我们每天都在使用的网络通讯协议,因为绝大部分的网络连接都是建立在TCP协议上的,比如你此刻正在看的这篇文章是建立在HTTP应用层协议的基础上的,而HTTP协议的底层则是 ...

  4. TCP 三次握爪 四次挥手

    TCP三次握手和四次挥手过程 1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向 ...

  5. TCP三次握手抓包分析

    1. TCP三次握手过程 最开始双方都是CLOSED关闭状态.然后服务端开启监听某个端口,进入LISTEN状态. 客户端发起请求,发送SYN,客户端变为SYN_SENT(同步消息发送)状态 服务端收到 ...

  6. TCP三次握手和syn攻击

    TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器 ...

  7. TCP三次握手抓包观察实战篇

    使用wireshark进行抓包,发现三个包有非常明显的三次握手的特征, syn syn + ack ack 但是还不能确定.所以打算通过seq num和ack num进行验证. 通过以下三步基本可以认 ...

  8. tcp三次握手和syn 洪水攻击

    1. 连接后,所有的 ack 为1才有效(连接后,ack 也一般都是1) 2. 建立连接3次握手, 如何确认对方收到了你发的包, seq 是自己发出去的,自己知道seq的值.所以怎么确认对方收到了自己 ...

  9. 【1】TCP三次握手的第三次的 ack包丢失会怎样?

    面试题: 在 TCP 建立连接的三次握手连接阶段,如果客户端发送的第三个ACK包丢了,那么客户端和服务端分别进行什么处理呢? 相信了解 tcp 协议的人,三次握手的过程肯定很了解了.第三次的 ack ...

最新文章

  1. 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇4:PC应用开发)
  2. python的gui库哪个好_常用的13 个Python开发者必备的Python GUI库
  3. Spring的Java配置
  4. sublime中文输入(转)
  5. PDG转PDF的方法
  6. Web框架——Flask系列之Flask中的特殊变量和方法(十九)
  7. php的弹出窗口,弹出窗口 PHP
  8. PostgreSQL技术周刊第17期:PostgreSQL用户应掌握的高级SQL特性
  9. vnr懒人版教程_凉皮懒人做法,不揉面不洗面,配方配料无保留,简单快速又好吃...
  10. JavawebJAVAJSP网吧计费管理系统(JSP网吧管理系统)网吧收费管理系统网吧自动计费管理系统
  11. 机载激光雷达原理与应用科普(六)
  12. 学习HTML 笔记A3 :HTML标题、段落、文本格式化
  13. `OSError: file error: bad input file` in RDkit with .sdf file
  14. STM32 SPI获取磁性角度传感器AS5048A角度数据
  15. 网站启用CDN加速对百度SEO排名有什么影响?
  16. UL1007 UL1015与AWG
  17. 可用的交换空间为 0 MB
  18. python输出间隔_Python:print输出间隔,换行
  19. 大牛约翰·卡马克语录
  20. Resistors in Paralle题解

热门文章

  1. 小白都能懂的设计模式 java版 抽象工厂模式 实战练习(超详细)
  2. 搭建红外遥控arm-hadoop集群过程
  3. 2020 零基础 Vue综合应用 教开发音乐播放器—悦听(激发编程乐趣)【整理+源码】
  4. Python 源码学习:类型和对象
  5. 【LaTeX中英排版系列】LaTeX中英双标题、作者、机构、摘要文档首页排版指北
  6. rgb html转换,RGB与十六进制数值互转(html)
  7. oracle通过什么命令释放锁,oracle检测锁,释放锁
  8. Windows下Qt+minGW+CMake+opencv配置--方法总结、文件分享与排错分享
  9. 《影响力》第七章:稀缺
  10. ospf 指定dr_OSPF DR BDR 配置方法2