TCP | TCP协议格式 | 三次握手

news2024/9/20 16:13:03
1.TCP协议

为什么需要 TCP 协议 ?TCP 工作在哪一层?

IP网络层是不可靠的,TCP工作在传输层,保证数据传输的可靠性。 TCP全称为 “传输控制协议(Transmission Control Protocol”)。

TCP 是面向连接的、可靠的、基于字节流

  • 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
  • 可靠的:无论的网络链路中出现了怎样的链路变化,TCP有很多策略 都可以保证一个报文一定能够到达接收端;
  • 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。
2.TCP协议格式详解

  • 源端口号和目的端口号:表示数据是从哪个进程来, 到哪个进程去。通过端口号将报文交付给上一层

  • 4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节)。4个比特位[0000 -1111]最大是15再乘以4个字节(单位),一共能表示60个字节。报头长度 = 固定长度(20字节) + 选项。通过4位TCP报头长度就可以将一个完整报文的报头和有效载荷分离。

  • 窗口大小:通过read这样的接口,是将用户级缓冲区的数据拷贝都系统级缓冲区中,主机再将数据通过网络发送到目标主机,其实网络的发送本质也是拷贝。那么如果数据一直发,对方没有来得及接收,大量的数据"打满"了接收缓冲区导致数据丢包的问题,这是一种不可靠的表现。TCP保证可靠性,通过16位窗口大小来填写自己接收缓冲区的剩余空间,告知对方进行流量控制。

在这里插入图片描述

窗口的大小如何告知对方

Client向Server发送数据,Server收到报文会应答。应答也是基于TCP协议通信的,必须是一个完整的TCP报文(可以没有数据,但至少是完整的报头)!窗口大小通过应答报文告知Client,当然TCP会有**捎带应答(Server也要发送数据捎带的将窗口大小告知对方(数据+应答))**的机制,有可能不会发送单独的应答报文。
在这里插入图片描述

  • 序列号:用来解决网络包乱序问题

  • 确认序列号:表示确认序列号之前的数据,已经全部收到,下次发送请从确认序列号指定的数字开始发送。

    序列号和确认序列号的理解

    TCP为了提高效率,不会串行化的传输数据,而是Client发送一批数据给Server。那么Server无法得知报文的顺序而导致数据包乱序的问题,而乱序本身就是一种不可靠的表现。所以通过序列号,按序接收就能保证顺序问题

    Server对Client发送而来的数据序列号+1,响应确认序列号。表示确认序列号之前的数据,已经全部收到,什么意思呢,如:Server响应2001表示前面发送的2000个字节的数据都收到了,所以允许1001应答报文丢失。确认序列号允许少量的应答报文丢失(这里不携带数据),如果是数据丢失会有重传的机制。

    在这里插入图片描述

    当然序列号的初始值,是在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。

    HTTP中会定义一个用户级的缓冲区,想象成一个大数组。系列号会根据数组的下标来确定会更好理解。

在这里插入图片描述

  • 6个标记位:区分TCP报文的类型

    TCP通信需要建立连接,建立完成之后才是正常通信,通信完毕后会断开连接。**不要扯什么,无论是建立连接的报文、正常通信的报文、还是断开连接的报文,都是一个完整的TCP报文!**如何区分是哪种类型的报文呢,这就可以根据报文中的标记位来区分。

    在这里插入图片描述

    1. SYN:设为 1 时,表示希望建立连接(称为同步报文段),并在其「序列号」的字段进行序列号初始值的设定

    2. ACK:设为 1 时,「确认应答」的字段变为有效;TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1

    3. FIN :设为 1 时,表示今后不会再有数据发送,希望断开连接。

    4. RST : 设为 1 时,对方要求重新建立连接; 把携带RST标识的称为复位报文段

    5. PSH:设为 1 时,提示接收端应用程序立刻从TCP缓冲区把数据读走。

      Client一直向服务器发送数据,有可能服务器,很繁忙没来得及读取接收缓存的内容,PSH字段提示接收端应用程序立刻从TCP缓冲区把数据读走;但如果有一个极端,应用程序就没有读取数据的方法,那这不扯了吗,要设计一个程序通信,结果又不读取数据,这像什么话啊!

在这里插入图片描述

  1. URG:设为 1 时,紧急指针有效

    Server服务器负载过大,无法处理Client发来的普通报文,因为报文需要按序排队。但又想知道Server在处理什么工作,可以在编码时设置MSG_OOB(如:1表示IO操作)这样的属性,然后将URG设置为1,让这个报文的紧急字段指向的数据有效,插队处理。

    16位紧急指针字段表示紧急数据的首地址,紧急数据不能太大,一般是首地址往后的1个字节

    在这里插入图片描述

3.TCP的三次握手和四次挥手
3.1.TCP的握手过程

这个地方参照的是小林哥的博客

在这里插入图片描述

  • 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。
  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYNACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。
  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。
  • 服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。

总结

在这里插入图片描述

任何一个网络协议都无法保证100%的可靠性!TCP建立连接的时候最后一个ACK应答,没有没有应答的,如果有应答有应答,那就衍生了鸡生蛋蛋生鸡的问题。但是三次握手能保证局部的可靠性。

为什么是三次握手?不是两次?四次?

首要原因是为了防止旧的重复连接初始化造成混乱

客户端先发送了 SYN(seq = 90)报文,然后客户端宕机了,而且这个 SYN 报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了 SYN(seq = 100)报文(注意!不是重传 SYN,重传的 SYN 的序列号是一样的)
在这里插入图片描述

其实,三次握手服务器最后才进入ESTABLISHED,通过这样奇数次连接的方式,如果建立过程中的报文丢失,都可以将失败的成本嫁接到客户端。 另外三次握手保证了通信的全双工验证,保证通信的局部可靠,还有就是可以同步双方初始序列号等。

无论是一次还是两次,客户端向服务端请求连接,SYN到达服务器就立马ESTABLISHED状态,服务器需要创建对应的内核数据结构维持连接,有明显的SYN洪水的问题。

而为什么不是四次,其实也可以是四次,但是TCP有捎带应答的机制,服务器向客户端发送SYN时捎带了ACK。说白了三次握手的最小次数的连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1537324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KDB+Q | D1 | 学习资源 基础数据类型

官网会是主要的学习资源:https://code.kx.com/q/ 中文教程可能读起来会快一点: https://kdbcn.gitee.io/ 参考了还不错的学习经验帖:https://www.jianshu.com/p/488764d42627 KDB擅长处理时序数据, KDB数据库是后端数据库&…

MySQL数据库存储引擎MyISAM与InnoDB

前言 MySQL存储引擎是MySQL数据库中负责管理数据存储和检索的组件,不同的存储引擎提供了不同的功能和特性,可以根据实际需求选择合适的存储引擎来优化数据库性能和功能。以下是一些常见的MySQL存储引擎:InnoDB、MyISAM、MEMORY、NDB Cluster…

Ribbon知识点

1、通过类实现重写Ribbon规则 1.1注意 这个类一定不能跟启动类放在同一个包下面,不能被componentScan给扫描到。 需要如图放置: 要是被componentScan给扫描到,则会被所有的服务提供方所共享,那么就不能实现指定服务用不同的Ribbo…

权限提升-Windows权限提升篇溢出漏洞宝塔面板BypassCS插件化MSF模块化

知识点 1、Web到Win系统提权-权限差异原因 2、Web到Win系统提权-溢出漏洞(MSF&CS) 3、Web到Win系统提权-集成软件(哥斯拉模块Bypass) 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移…

【Java Web基础】一些网页设计基础(四)

文章目录 1. 做Tab切换2. 下面的内容展示——Card样式3. 采供分类&#xff0c;分类用面包屑导航做4. 出名企业展示&#xff0c;就是普通的图片5. 用热门商品类似的panel做一个农博会展览 1. 做Tab切换 使用BootStrap提供的样式&#xff1a; <ul class"nav nav-tabs&q…

【Linux】系统开启和关闭过程

Linux 系统启动过程 BIOS 自检&#xff1a;在计算机开机时&#xff0c;BIOS 会进行自检&#xff0c;检查硬件设备是否正常。 加载引导程序&#xff1a;BIOS 自检完成后&#xff0c;会加载引导程序&#xff0c;如 GRUB、LILO 等。引导程序会加载内核和初始化 RAM 磁盘&#xff…

005——串口移植(基于鸿蒙liteos-a)

目录 一、 Liteos-a中串口的使用 1.1 内核里打印 1.2 APP控制台 ​编辑 1.2.1 /dev/console 1.2.2 /dev/serial 1.2.3 /dev/uartddev-0 1. 总体介绍 2. device_t 3. drvier_t 4. uartdev_fops 1.2.4 uart_ops 二、 鸿蒙串口内部的一些机制&#xff08;流水账&…

实用福利网站分享

1.http://www.w3school.com.cn w3school&#xff0c;很好的在线web学习网站&#xff0c;免费 2.https://sklearn.apachecn.org sklearn文档&#xff0c;虽然是文档&#xff0c;但能学到很多很多具体的机器学习例子和知识 3.http://www.runoob.com 菜鸟教程&#xff0c;也是…

GTC大会干货:8位大佬对Transformer起源和未来发展的探讨

在2024年的GTC大会上&#xff0c;黄仁勋特邀Transformer机器语言模型的七位创造者&#xff0c;共同探讨Transformer模型的过去、现在与未来。他们一致认为&#xff0c;尽管Transformer已经成为现代自然语言处理领域的基石&#xff0c;但这个世界仍然需要超越Transformer的新颖架…

使用远程工具连接Mysql

&#xff08;若想要远程连接Mysql需要下面解决四个问题&#xff09; 1、目标地址 直接查询 2、端口号 3306 3、防火墙关闭 [rootlocalhost date]# systemctl stop firewalld.service 4、授权mysql数据库root用户权限&#xff08;因为mysql开始不允许其他IP访问&#xff0…

Java 栈与队列

一、栈 在Java中&#xff0c;实现栈有两个方法&#xff1a; Java本身的集合类型Stack类型。Stack集合类型继承于Vector&#xff0c;由于Vector是通过数组实现的&#xff0c;所以Stack集合类型也是通过数组来实现的。借用LinkedList来间接实现栈。LinkedList是双向链表&#x…

【pcolor数据可视化】Matlab vs. Python

1、Matlab代码及结果 代码 clear;clc load(.\nclcolormap.mat)sl [0,50,100,200,500,0]; el [50,100,200,500,1000,200];for i 1:length(sl)file [..\data\static_result\VIS_Min-,num2str(sl(i)),to,num2str(el(i)),_yearly.npy];data readNPY(file);maskreadNPY(.\mas…

2024阿里云服务器99计划优惠活动_开年采购季优惠价格表

2024阿里云开年采购活动3月优惠&#xff0c;99计划云服务器99元一年、免费领取上云扶持优惠券&#xff0c;不只是云服务器、云数据库、存储、云电脑、域名等均有活动&#xff0c;阿里云服务器网aliyunfuwuqi.com整理阿里云开年采购上云无忧活动入口、优惠价格表和优惠券领取详细…

【Linux】信号的处理{信号处理的时机/了解寄存器/内核态与用户态/信号操作函数}

文章目录 0.对于信号捕捉的理解1.信号处理的时机1.1 何时处理信号&#xff1f;1.2 内核态和用户态1.3 内核态和用户态的切换 2.了解寄存器3.信号捕捉的原理4.信号操作函数4.1sighandler_t signal(int signum, sighandler_t handler);4.2int sigaction(int signum, const struct…

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和 455. 分发饼干题目解法 376. 摆动序列题目解法 53. 最大子数组和题目解法 感悟 455. 分发饼干 题目 解法 class Solution { public:int findContentChildren(vector<int>& g, vec…

大模型时代,5个最顶级的向量数据库

介绍5个向量数据库。 大模型时代&#xff0c;向量数据库彻底的火了&#xff0c;今天我分享业内最频繁使用的向量数据库&#xff0c;更多实践经验&#xff0c;可以文末参加我们的技术落地的讨论&#xff0c;喜欢本文记得收藏、关注、点赞。 1 Chroma 使用ChromaDB构建LLM应用程…

D咖:颠覆传统,重塑无人自助饮品机新篇章

在当今的快节奏社会中&#xff0c;智能科技正在以前所未有的速度渗透到生活的各个方面&#xff0c;从智能手机到智能家居&#xff0c;它们不仅极大地提高了我们的生活效率&#xff0c;也在不断地改善和丰富我们的生活体验。而饮品行业&#xff0c;作为人们日常生活中不可或缺的…

TCP协议的粘包问题解决方式

粘包问题 首先说明一点&#xff0c;TCP有粘包问题&#xff0c;UDP没有粘包问题。 发送端可以是1KB地发送数据&#xff0c;而接收端的应用程序可以2KB地提走数据&#xff0c;当然也有可能一次提走3K或6K数据&#xff0c;或者一次只提走几个字节的数据&#xff0c;也就是说&…

VS Code 跳板机登录服务器(手打密码+秘钥登录)

目录 0.为什么要用跳班机登陆服务器&#xff1f; 1.VS Code插件安装及ssh安装 2.密码链接方式 1&#xff09;添加ssh设置&#xff0c;设置主机 2)设置跳板机 Tips:可以直接通过窗口连接文件管理 3.密钥连接方式&#xff08;更安全更方便&#xff09; 1&#xff09;mac版…

常见优化器对比:梯度下降法、带动量的梯度下降法、Adagrad、RMSProp、Adam

系列文章目录 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》优化算法&#xff08;相关概念、梯度下降法、牛顿法&#xff09; 李沐《动手学深度学习》优化算法&#xff08;经典优化算法&#xff09; 文章目录 系列文章目录一、梯度下降法&#xff08;一…