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

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.rhkb.cn/news/282702.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京东云开发者:DDD 学习与感悟 —— 向屎山冲锋

原文地址:https://mp.weixin.qq.com/s/Hvq1ttBopbxypatVcKcLiA 软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此,软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计…

opengl 学习(六)-----坐标系统与摄像机

坐标系统与摄像机 分类引言坐标系统摄像机教程在CMake中使用全局定义预编译宏,来控制是否开启错误检查补充 分类 opengl c 引言 OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说&#xff…

OCP NVME SSD规范解读-14.Firmware固件升级要求

4.11节 Firmware Update Requirements 描述了数据中心NVMe SSD固件更新的具体要求,确保固件升级过程既安全又可靠,同时充分考虑了设备在升级过程中的可用性和功能性。 FWUP-1: 设备必须记录每一次固件激活过程。这意味着固件升级过程中,设备会…

【Dynamics 365 FO】在Dynamics 365中建立一个SSRS报表

建立一个SSRS报表主要有以下8个步骤: 目录 1、新建合约类 合约类(Contract Class)的作用是获取查询数据源所需要的数据,在我们点开报表的时候,系统会弹出一个对话框让我们来选择字段来筛选要查询数据,合…

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

CANoe自带的TCP/IP协议中TCP发送时的一个特殊处理(我一定是第一个发现的)

我们知道,CANoe软件中配置以太网通道后,添加的仿真节点可以作为一个主机或者一个应用来实现以太网通信。但不管是作为主机还是应用,仿真节点都需要配置TCP/IP协议栈。 有了TCP/IP协议栈,设置了网卡信息后(IP地址、MAC地址等),仿真节点就可以通过编写CAPL代码的方式发送和…

关于UDP协议

UDP协议是基于非连接的发送数据就是把数据包简单封装一下,然后从网卡发出去就可以,数据包之间没有状态上的联系,UDP处理方式简单,所以性能损耗非常少,对于CPU、内存资源的占用远小于TCP,但是对于网络传输过…

[综述笔记]A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis

论文网址:Frontiers | A Survey on Deep Learning for Neuroimaging-Based Brain Disorder Analysis (frontiersin.org) 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论…

visual studio卸载几种方法

1、控制面板卸载; 2、有时候会发现控制面板卸载会失败,无法卸载,这时候要先把下面目录的关于visual studio的都删除,然后重启电脑后,重新安装vs即可。

java Flink(四十三)Flink Interval Join源码解析以及简单实例

背景 之前我们在一片文章里简单介绍过Flink的多流合并算子 java Flink(三十六)Flink多流合并算子UNION、CONNECT、CoGroup、Join 今天我们通过Flink 1.14的源码对Flink的Interval Join进行深入的理解。 Interval Join不是两个窗口做关联,…

全流程ArcGIS Pro技术应用

GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…

HQYJ 2024-3-19 作业

TCP通信三次握手和四次挥手: 并行和并发的区别:并发是单核处理器处理多个线程任务,并行是多核处理器同时处理多个线程任务。并发过程中会抢占CPU资源,轮流使用;并行过程不会抢占CPU资源。 阻塞IO和非阻塞IO&#xff…

【系统架构师】-计算机网络

1、网络的划分 网络性能指标:速率、带宽(频带宽度或传送线路速率)、吞吐量、时延、往返时间、利用率。 网络非性能指标:费用、质量、标准化、可靠性、可扩展性、可升级性、易管理性和可维护性。 总线型(利用率低、干扰大、价格低)、 星型(交换机转发形…

Python PyQt5

实现界面开发,与tkinter功能一致,网上已有详细资料,此处仅记录自己的代码: 文章目录 1. 实操1.1 main.py1.2. 窗体模块代码1.3. 页面效果 2. 参考资料2.1. PyQt5 参考资料2.2. tkinter 参考资料 3. 安装注意事项3.1. 下载3.2 Pyc…

解决jenkins运行磁盘满的问题

参考:https://blog.csdn.net/ouyang_peng/article/details/79225993 分配磁盘空间相关操作: https://cloud.tencent.com/developer/article/2230624 登录jenkins相对应的服务或容器中查看磁盘情况: df -h在102挂载服务器上看到是这两个文件…

数据结构:详解【栈和队列】的实现

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的功能1.4 栈的功能的实现1.5 完整代码 2. 队列2.1 队列的概念及结构2.2 队列的实现2.3 队列的功能2.4 队列的功能的实现2.5 完整代码 1. 栈 1.1 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的…

leecode1793 | 好子数组的最大分数 | 求给高度矩阵最大值

题目我就不念了,就一个字难理解,给的题总是这么难懂,总感觉出题人的语文是体育老师教的? 还有就是思维转变,才能能好的理解?一味的钻牛角尖死理解,效果不好 思维的转变 >悟性?&am…

使用远程工具连接Mysql

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

Docker 学习笔记

Play With Docker一个免费使用的基于web界面的Docker环境 常用docker命令 可使用docker COMMAND --help查看命令的用法 Docker镜像相关 1、docker image pull:用于下载镜像,镜像从远程镜像仓库服务的仓库中下载,默认从Docker Hub的仓库中拉…

ssm基于Vue.js的在线购物系统的设计与实现论文

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于在线购物系统当然也不能排除在外,随着网络技术的不断成熟,带动了在线购物系统,它彻底改变了过去传统的…