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。说白了三次握手的最小次数的连接。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DBO优化高斯回归预测(matlab代码)

DBO-高斯回归预测matlab代码 蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法,在2022年底提出,主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 数据为Excel股票预测数据。 数据集划分为训练集、验证集、测试集,比例…

GESP图形化编程四级认证真题 2024年3月

GESP 图形化四级试卷 (满分:100 分 考试时间:120 分钟) 一、单选题(共 10 题,每题 2 分,共 30 分) 1、小杨的父母最近刚刚给他买了一块华为手表,他说手表…

PyTorch深度学习:遥感影像地物分类的高效工具

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…

JMeter 环境安装及配置

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

图像分类从零开始(1)

尽我所能,总结留给后面的师弟们! 1.目标 搭建一个完整的系统,包括图像数据集预处理,训练模型,分类器,优化器,以及结果数据处理。 2.理论 3.实例(猫狗分类) Gitee代码…

day-24 跳跃游戏 III

思路:dfs方法,从开始节点开始进行深度优先遍历,利用一个数组vis[]记录该位置是否被访问过,如果遍历到一个已经访问的位置,返回false 如果遍历到某位置的值为0,返回true code: class Solution {public boo…

Vulnhub - Raven2

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 个人博客链接:CH4SER的个人BLOG – Welcome To Ch4sers Blog Raven2 靶机下载地址:https://www.vulnhub.com/entry/raven-2,269/ 0x01 信息收集 Nmap扫描…

力扣算法题之好数对的数目

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

性能测试的几个重要指标的说明!

在做性能测试过程中有一件很重要的事情需要去完成,那就是分析性能指标数据,可以这样说做性能测试的整个过程都跟指标数据息息相关,下面来说一下常见的一些性能指标数据: 1.吞吐量 2.并发数 3.思考时间 4.响应时间 5.点击数 …

3D模型库免费下载选择哪家比较靠谱?

在选择3D模型库进行免费下载时,靠谱性通常取决于模型的质量、数量、多样性、易用性,以及网站的信誉和安全性。以下是一些比较靠谱的3D模型库免费下载网站: ①建e网:建e网的3D模型库提供了多种分类方式,如风格、场景、物…

手撕LRU 最近最少使用缓存淘汰策略 + LinkedHashMap

LRU 最近最少使用缓存淘汰策略 1 LRU 算法就是一种缓存淘汰策略2 手撕LRU3 LinkedHashMap 常见面试题 1 LRU 算法就是一种缓存淘汰策略 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢&#x…

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

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

看完秒懂原来接口测试用例设计这么简单!

什么是接口 接口:服务端程序对外提供的一种统一的访问方式,通常采用 HTTP协议,通过 不同的url,不同的请求类型(GET、POST), 不同的参数,来执行不同的业务逻辑。 客户端大多数的业务…

MySQL关联查询如何优化

好久不见,关于这篇文章,我也是想了很久,还是决定写一篇文章,有很多同学问过 mysql 相关的问题,其实关联查询如何优化,首先我们要知道关联查询的原理是什么? 左连接 left join SELECT 字段列表…

软件测试面试,你准备好了吗?

最近有机会做一些面试工作,主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色,经历了不少次的面试之后,多少也积累一点面试的经验,现在发生了角色转变。初次的面试就碰到个工作年限比我长的,也没有时…

北斗卫星在公路养护中的应用

北斗卫星在公路养护中的应用 北斗卫星是我国自主研发的一款卫星导航系统,它为公路养护工作提供了新的解决方案。通过使用北斗卫星技术,公路养护部门可以实时获取道路状况,提高工作效率,为交通安全保驾护航。 首先,北斗…

Java使用工厂方法实现聚合调用不同第三方接口进行实名验证

在Java中使用工厂方法实现聚合实名验证指的是创建一种实名验证服务,可以连接到不同的实名验证处理器,比如阿里、腾讯等。我们可以定义一个实名验证接口,然后实现不同的实名验证方式,最后使用一个工厂来创建相应的实名验证实例。以…

MySQL实现事务隔离的秘诀之锁

在MySQL中,有多种锁类型,我们先了解三种概念的锁,以便对接下来的内容有更好理解。 表级锁(Table Lock):对整个表加锁,其他事务无法修改或读取该表的数据,但可以对其他表进行操作。页…

SpringCloud入门(1) Eureka Ribbon Nacos

这里写目录标题 认识微服务SpringCloud 服务拆分和远程调用服务拆分案例实现远程调用 RestTemplate Eureka注册中心Eureka的结构和作用搭建eureka-server服务注册服务发现 Ribbon负载均衡 LoadBalancedLoadBalancerIntercepor源码解析负载均衡策略饥饿加载 Nacos注册中心安装与…

Java通过SSH连接数据库

一、实现思路 1 实现思路&#xff1a;本地–>跳板机–>目标数据库 2 IP走向&#xff1a;127.0.0.1:5432 --> 192.168.1.111 -->10.11.12.13:5432 二、引入maven <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifa…