头部信息

TCP首部存储的数据和建立连接有关,具体每个字段的用途可以参考这一篇文章,其中序号和确认号决定了发送数据的内容。

  • 头部中间部分"保留"和"窗口"中间是标志位,会携带一些连接的信息
  • 序号(Sequence Number):当前TCP数据部分的第一个字节编号(实际是一个非常大的值,非常大的值 - 固定值 = 小的编号,同一请求有一个固定值,固定值来源于建立连接时seq=0时)
  • 确认号(Acknowledgment Number):ACK=1时才有效,期望对方下一次传过来的TCP数据部分的第一个字节编号

三次握手

建立连接的时候会有三步,也就是我们所说的三次握手。

  • SYN=1,ACK=0,序号 seq=x(连接之初的客户端固定值,简单来说就是0),没有发任何字节,所以数据长度为0,此时是客户端向服务器发送的建立连接请求。
  • SYN=1,ACK=1,序号 seq=y(连接之初的服务器固定值,简单来说就是0),确认号 ack = x+1,数据长度为0,此时是服务器向客户端发送响应,表示希望收到客户端发送第1个字节的数据。
  • SYN=0,ACK=1,序号 seq=x+1,确认号 ack=y+1,数据部分长度为0,此时客户端确认收到服务器的确认消息,建立连接完成。表示希望收到服务器第一个字节的数据。

连接时,存在一些状态的变化

  • CLOSED:client处于关闭状态
  • LISTEN:server处于监听状态,等待client连接
  • SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态
  • SYN-SENT:表示client已发送SYN报文,等待server的第2次握手
  • ESTABLISHED:表示连接已经建立

抓包数据来看如下所示

疑问

那么可能有人会问,为什么需要三次握手,两次不就可以互相确认了吗?

三次握手的目的:防止server端一直等待,浪费资源。

如果只有两次握手,第一次发送SYN=1时因网络延迟没发送成功,那么客户端会再发送一次SYN=1的建立请求,此时发送成功,客户端和服务器之间完成通信。

过了一段时间,第一次发送的SYN=1消息才发送到服务器,此时服务器以为是新的建立连接过程,又会回复一个SYN=1,ACK=1的响应。

如果只有两次连接,服务器会以为成功建立连接,但实际上客户端的数据已经获取到,不会再发送请求了,服务器就会处于一直等待的状态。

采用三次握手就可以防止这样的情况,因为第三次请求没发送给服务器,所以它处于同步已接受状态,如果一直没有收到第三条请求则会关闭连接。

那如果第三次握手失败了呢?

此时server的状态为SYN-RCVD,若等不到client的ACK,server会重新发送SYN+ACK包。如果server多次重发SYN+ACK都等不到client的ACK,就会发送RST包,强制关闭连接。

数据传输

当获取连接后,就可以开始真正的传输数据啦

  • 服务器发送第一条请求给客户端,SYN=0,ACK=1,seq=1,ack=583,len=1280,发送数据的序号从1开始,希望对方发送数据从583字节开始。
  • 服务器发送第二条请求给客户端,,SYN=0,ACK=1,seq=1281,ack=583,len=2560,因为上一次请求发送了1280字节的数据,所以此条数据从1281开始,还没有收到客户端的数据,所以确认号仍然为583。
  • 服务器发送第三条请求给客户端,SYN=0,ACK=1,seq=3841,ack=583,len=1280,到上一次请求的数据已经发送到了1280+2560,所以此次从3841字节的数据开始。
  • 客户端回应服务器发送的请求,SYN=0,ACK=1,seq=583,ack=3841,len=0,因为服务器希望收到583字节开始的数据,所以这里序号为583,确认号为3841,希望收到对方以3841开始的数据(这里可能上一条数据还没有收到),长度为0表示只是确认收到的响应。

到这里就是完整的【建立连接】,以及发送请求流程。关于【释放连接】,会在下一篇文章中描述。

以上就是关于 从序号和确认号理解TCP三次握手 的内容 , 更多有关 前端网络协议 的内容可以参考我其它的博文,持续更新中~

从序号和确认号理解TCP三次握手的更多相关文章

  1. 理解TCP三次握手和四次挥手

    TCP相关知识 TCP是面向连接的传输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议并没有明确要求必须使用TCP协 ...

  2. 彻彻底底地理解TCP三次握手和四次挥手的全部过程

    三次握手 我们先提出一些问题,但是我们暂且不回答这些问题,下面我会尽我所能详尽地讲解TCP的三次握手过程,然后看完你可以在评论区留下你对问题的答案,我们可以一起探讨. 为什么要握手 为什么是三次而不是 ...

  3. 理解TCP三次握手/四次断开的必要性

    1 TCP的三次握手与必要性 (1)三次握手图 (2)必要性:TCP通过三次握手建立可靠的(确保收到)的全双工通信. 1)第一次握手和第二次握手(ACK部分)建立了从客户端到服务器传送数据的可靠连接: ...

  4. 深入理解TCP三握四挥

    面试中被问到不少次TCP的三握四挥,今天特意来做一个总结(一些资料是很久前找的,忘了参考的链接了) 一.三次握手 首先来看一张图 最初,客户机A与服务器B的TCP进程都处于 CLOSED 状态. 然后 ...

  5. 转 TCP中的序号和确认号

    在网络分析中,读懂TCP序列号和确认号在的变化趋势,可以帮助我们学习TCP协议以及排查通讯故障,如通过查看序列号和确认号可以确定数据传输是否乱 序.但我在查阅了当前很多资料后发现,它们大多只简单介绍了 ...

  6. TCP 三次握手原理,你真的理解吗?

    最近,阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么观察他们的指标说清楚. 因此,蛰剑写下这篇文章 ...

  7. TCP三次握手形象理解

    tcp三次握手就像是你用企业微信给人家发信息,首先你得确认别人在不在,你会发  在吗?  这个时候显示的是未读   对方看到之后未读会变成已读 然后他会回复你  在的    你看到这个消息后,他那边也 ...

  8. 谈谈你对 TCP 三次握手和四次挥手的理解

    TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...

  9. TCP三次握手、四次挥手理解

    tcp三次握手建立连接第一次握手 客户端发送给服务器一段连接请求报文,等待服务器回应 第二次握手 服务器收到报文,并发送给客户端一个确认报文,等待客户端回应 第三次握手 客户端收到新报文 ,再发送给服 ...

  10. 第五章 运输层(UDP和TCP三次握手,四次挥手分析)

    序言   通过这章,可以知道其实三次握手和四次挥手其实真的好简单,通过这章的学习,我相信你也会同样的认为,以后在也不需要听到别人问三次握手的过程而自己一脸懵逼了,觉得人家好屌,其实也就是他懂你不懂,仅 ...

随机推荐

  1. MASAMinimalAPI:创建MinimalAPI项目

    项目准备 1.创建项目,选择webapi.取消勾选使用控制器.创建minimal Api项目 2.创建成功后MinimalAPI的接口直接写在program.cs中 3.引入nuget包:Masa.C ...

  2. 【Linux】Linux 基础入门

    Linux 发行版(发行版之间的联系与区别) 红帽公司开发的RedHat Enterprise Linux,它是全世界内使用最广泛的Linux系统,具有极强的性能与稳定性,并且在全球范围内拥有完善的技 ...

  3. 音视频八股文(11)-- ffmpeg 音频重采样

    1重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率.sample format.声道数等参数,使之按照我们期望的参数输出. 1.2 为什么要重采样 为什么要重采样?当然是原有的⾳频参数 ...

  4. 2021-09-01:三数之和。给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

    2021-09-01:三数之和.给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. ...

  5. C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)

    信创是现阶段国家发展的重要战略之一,面对这一趋势,所有的软件应用只有支持信创国产化的基础软硬件设施,在未来才不会被淘汰.那么,如何可以使用C#来实现支持信创环境的视频会议系统吗?答案是肯定的. 本文讲 ...

  6. vue平铺日历组件之按住ctrl、shift键实现跨月、跨年多选日期的功能

    已经好久没有更新过博客了,大概有两三年了吧,因为换了工作,工作也比较忙,所以也就没有时间来写技术博客,期间也一直想写,但自己又比较懒,就给耽误了.今天这篇先续上,下一篇什么时候写,我也不知道,随心所欲 ...

  7. CentOS系统重命名

    感觉默认的系统名称很难看,得改改,如下 一.查看linux 系统版本信息 [root@iZbp15rmf8lyj2yhq136ebZ ~]# cat /etc/redhat-release CentO ...

  8. 柏林噪声&幻想大陆地图生成

    序言 之前介绍过perlin噪声的实现,现在应用实践一下--程序化生成幻想大陆 这里使用的是perlin噪声倍频技术(也称分形噪声),详情传送门:柏林噪声算法 代码示例使用的是shadertoy的语法 ...

  9. 包含引用类型字段的自定义结构体,能作为map的key吗

    1. 引言 在 Go 语言中,map是一种内置的数据类型,它提供了一种高效的方式来存储和检索数据.map是一种无序的键值对集合,其中每个键与一个值相关联.使用 map 数据结构可以快速地根据键找到对应 ...

  10. tryhackem_wonderland

    涉及,解密,扫描,横向移动,纵向移动 仙境 掉进兔子洞,进入仙境. 获得shell 解法一: 目录扫描 ffuf -u http://10.10.134.189/FUZZ -w /usr/share/ ...