12 tcp协议详解

1、tcp的本性

tcp是一个悲观者,生下来就不信任网络,任务会发生丢包等,所以要从算法层面来保证可靠性。

2、TCP 包头格式

tcp的包头格式比UDP要复杂的多。
在这里插入图片描述

1.源端口号和目标端口号是不可少的,这一点和 UDP 是一样的。如果没有这两个端口号。数据就不知道应该发给哪个应用。
2.包的序号:是为了解决乱序的问题。不编好号怎么确认包到达的前后顺序。
3.确认序号:发出去的包需要ack,不然我也不知道有没有收到,如果没有收到,就应该重发,直到收到为止。//这个可以解决不丢包的问题
4.状态位:SYN:是发起一个连接ACK 是回复RST 是重新连接FIN 是结束连接//TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更

注意:tcp虽然是靠谱的协议,但是网络环境不好的时候,对于IP层丢不丢包,它也没有办法,tcp唯一能做的就是不断地重试。

3、tcp的握手和技能
  1. tcp如何保证对于连接的信任呢,为什么需要握手呢,这就好比人与人之间不会第一次见面就信任对方吧,怎么也得握手几次吧。
  2. tcp做流量控制:通信双方各声明一个窗口,标识自己当前能够的处理能力,别发送的太快,也别发的太慢。
  3. tcp拥塞控制:对于网络是否拥堵,tcp是无能为力的,唯一能做的就是控制自己,也即控制发送的速度。
  4. tcp需要关注的点如下:
1.顺序问题 ,稳重不乱
2.丢包问题,承诺靠谱
3.连接维护,有始有终
4.流量控制,把握分寸
5.拥塞控制,知进知退
4、TCP 的三次握手

tcp连接的建立,又称3次握手,这是一个连接维护的问题,这样比较便于理解。
就是一个:“请求 -> 应答 -> 应答之应答

A: 您好,我是A
B: 您好,我是B
A:  您好,B

为啥不是2次,4次?

1.假设网络环境不好,A发出了一个请求,包有可能会丢失或者请求超时了,于是A一直补发,直到B收到了请求,但是B收到的请求的时候,A可能不直到,所以A还会再发。如果B收到了请求:一是B不愿意建立练级,A会在一定时间后放弃二是B愿意建立连接,像A发送一个ack,但是B发出去的包也会像石沉大海一样,也不知道A有没有收到。
另外还有一种可能,就是之前A发送包出去绕了一圈回来了,B接收到了,同样认为这是一个正常的请求,于是给出了响应,这事听起来也是挺离谱的。
so,2次握手是不可靠的!2. 为啥不是4次?
不是4次不行,400次都行,只是这样会没完没了,理由如下:
B发出的消息可能会发送多次,A只要收到一次,就认为连接建立了,自己的请求有了响应,A发送一个应答的应答。
而B也在等这个消息,才能确认连接是否建立,只有等到了这个消息,对于B来说,这个消息是有始有终的。
对于应答的应答,也有可能会丢,会绕路,甚至B都宕机了,是不是需要B再这个基础之上再应答,如此的话,就是没完没了了。

只要双方的消息都有去有回,就基本可以了

1.大部分情况下,AB 建立了连接之后,A 会马上发送数据的,这个时候很多问题就得到了解决。
//例如 A 发给 B 的应答丢了,当 A 后续发送的数据到达的时候,B 可以认为这个连接已经建立,或者 B 压根就挂了,A 发送的数据,会报错,说 B 不可达,A 就知道 B 出事情了。
2.如果A 比较坏,就是不发数据,建立连接后空着。我们在程序设计的时候,可以要求开启keepalive 机制,即使没有真实的数据包,也有探活包。
3.我们作为服务的提供者来说,如果A一直不发包,则可以主动关闭这个连接
5、包的序号问题
  1. 三次握手除了双方建立连接外,主要还是为了沟通一件事情,就是TCP 包的序号的问题。
  2. 每个连接都要有不同的序号。这个序号的起始序号是随着时间变化的。
  3. 序号,可以看成一个 32 位的计数器,每 4ms 加一。
  4. IP 包头里面有个 TTL,也即生存时间。
6、TCP 四次挥手

在这里插入图片描述

7、tcp是咋靠谱的?
1.tcp为了保证顺序性,每一个包都有一个 ID
2.在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。
3.为了保证不丢包,对于发送的包都要进行应答。

累计确认/累计应答
应答也不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,称为累计确认或者累计应答.

  1. 由上面可以猜到,这就必须得保存这些统计的结果。
  2. 为了记录所有发送的包和接收的包,TCP 也需要发送端接收端分别都有缓存来保存这些记录。
  3. 发送端的缓存里是按照包的 ID 一个个排列(队列),根据处理的情况分成四个部分,如下所示:
1.第一部分:发送了并且已经确认的
2.第二部分:发送了并且尚未确认的
3.没有发送,但是已经等待发送的
4.没有发送,并且暂时还不会发送的

为什么要区分第三部分和第四部分呢?
这就是之前提到的流量控制,如果对方的处理能力弱,就等等再发。

Advertised window:

  1. 在 TCP 里,接收端会给发送端报一个窗口的大小,称Advertised window
  2. 窗口的大小应该等于上面的 第二部分 + 第三部分
    就是已经发送的正在处理的部分,再加上等待发送的部分已经是接收端处理的上线了,再多,就吃不下了。

发送端的数据结构:
依照服务端的要求,发送端的数据结构如下:
在这里插入图片描述LastByteAcked:第一部分和第二部分的分界线
LastByteSent:第二部分和第三部分的分界线
LastByteAcked + AdvertisedWindow:第三部分和第四部分的分界线

对于接收端来讲,它的缓存里记录的内容相对简单
第一部分:接受并且确认过的
第二部分:还没接收,但是马上就能接收的,即当前最大的处理能力
第三部分:还没接收,也没法接收的,即超负荷了
在这里插入图片描述MaxRcvBuffer:最大缓存的量
LastByteRead 之后是已经接收了,但是还没被应用层读取的
NextByteExpected 是第一部分和第二部分的分界线

第二部分的窗口有多大呢?

1.NextByteExpected 和 LastByteRead 的差其实是还没被应用层读取的部分占用掉的 MaxRcvBuffer 的量,我们定义为 A
2.AdvertisedWindow 其实是 MaxRcvBuffer 减去 A,也就是:AdvertisedWindow=MaxRcvBuffer-((NextByteExpected-1)-LastByteRead)
//那第二部分和第三部分的分界线在哪里呢?
1.NextByteExpected 加 AdvertisedWindow 就是第二部分和第三部分的分界线,其实也就是 LastByteRead 加上 MaxRcvBuffer.
2.第二部分里面,由于接收到的包可能不是顺序的,会出现空挡,只有和第一部分连续的,可以马上进行回复,中间空着的部分需要等待,哪怕后面的已经来了

顺序和丢包问题:涉及了RTT,自适应重传算法等,此处不做过多解读,感兴趣可以Google一下

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

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

相关文章

图形界面应用案例——关灯游戏(以及扩展)(python)

7.8 图形界面应用案例——关灯游戏 题目: [案例]游戏初步——关灯游戏。 关灯游戏是很有意思的益智游戏,玩家通过单击关掉(或打开)一盏灯。如果关(掉(或打开)一个电灯,其周围(上下左右)的电灯也会触及开关,成功地关掉所有电灯即可过关。 图7-43 关灯游戏运行效…

安防监控系统视频融合平台EasyCVR页面地图功能细节详解

安防监控视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff…

62、使用python进行rk3588开发板进行推流亚马逊云服务上,进行实时播放

基本思想:之前写了一套c++的推理和视频编解码,使用rk3588的mpp硬件进行编码和解码,然后使用RTSPServer进行推流,总是有问题,虽然可以使用ffplay和vlc进行拉取和播放,但是就是无法使用gstreamer推流到亚马逊云服务上,因为项目需求的紧急,所以先用python把流程跑同,后续…

linux基础指令【上篇】

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 引用 01. ls 指令2. pwd命…

FPGA的元素组件

注意:关于FPGA的元素这一块儿内容,稍有出入。例如:吉姆莱丁 著,陈会翔 译,由清华大学出版社出版的《构建高性能嵌入式系统》中提到:FPGA通常由查找表、触发器、块RAM、DSP切片、及其他功能元件等元素组成。…

互联网金融风控常见知识点

1.怎么做互联网金融风控 首先风险不是都是坏的,风险是有价值的。也就是风险的VaR值(Value at Risk) 对于互联网信贷风控,是要把风险和收益做到更合理的平衡,在控制风险水平的情况下使得收益更高。 所以,做风控的不是一味地追求耕…

设计模式—结构型模式之桥接模式

设计模式—结构型模式之桥接模式 将抽象与实现解耦,使两者都可以独立变化。 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不…

flink的带状态的RichFlatMapFunction函数使用

背景 使用RichFlatMapFunction可以带状态来决定如何对数据流进行转换,而且这种用法非常常见,根据之前遇到过的某个key的状态来决定再次遇到同样的key时要如何进行数据转换,本文就来简单举个例子说明下RichFlatMapFunction的使用方法 RichFl…

OceanBase 如何通过日志观测冻结转储流程?

本文旨在通过日志解析 OceanBase 的冻结转储流程,以其冻结检查线程为切入点,以租户(1002)的线程名为例。 作者:陈慧明,爱可生测试工程师,主要参与 DMP 和 DBLE 自动化测试项目。 爱可生开源社区…

技术分享|基于 Cluster API 的 Kubernetes 集群生命周期管理

作者:SmartX SKS 产品研发工程师 杨海剑 背景 容器的发展催生了容器编排技术,而容器编排技术反过来又推动了容器的发展。容器编排领域则一度出现了 Swarm、Mesos 和 Kubernetes 等百家争鸣的局面。但随着 Kubernetes 脱颖而出,Kubernetes 成为…

早安心语微语早读,好好善待自己,珍惜今天,期待明天

1、保持阳光心态,积极面对人生,每个人,都沿着不同的轨道在活着,人生是一趟单程车,我们最应该做的,就是好好善待自己,珍惜今天,期待明天,那些走过的,错过的&am…

零代码编程:用ChatGPT批量将Mp4视频转为Mp3音频

文件夹中有很多mp4视频文件,如何利用ChatGPT来全部转换为mp3音频呢? 在ChatGPT中输入提示词: 你是一个Python编程专家,要完成一个批量将Mp4视频转为Mp3音频的任务,具体步骤如下: 打开文件夹:…

2023最新版JavaSE教程——第4天:流程控制语句之循环语句

目录 一、循环语句二、for循环2.1 基本语法2.2 应用举例2.3 练习 三、while循环3.1 基本语法3.2 应用举例3.3 练习 四、do-while循环4.1 基本语法4.2 应用举例4.3 练习4.4 对比三种循环结构4.5 "无限"循环4.5.1 基本语法4.5.2 应用举例 4.6 嵌套循环(或多重循环)4.6.…

网络流量分类概述

1. 什么是网络流量? 一条网络流量是指在一段特定的时间间隔之内,通过网络中某一个观测点的所有具有相同五元组(源IP地址、目的IP地址、传输层协议、源端口和目的端口)的分组的集合。 比如(10.134.113.77,47.98.43.47,TLSv1.2&…

【K8s集群离线安装-kubeadm】

1、kubeadm概述 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令快速完成一个kubernetes集群的部署。 2、环境准备 2.1 软件环境 软件版本操作系统CentOS 7Docker19.03.13K8s1.23 2.2 服务器 最小硬件配置:2核CPU、2G内存…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring配置开发实战详解

360全方位渗透和探究Spring配置开发实战详解 Spring对于配置的转折点Xml配置 vs Java配置Xml配置模式的优点Xml配置模式的缺点Java配置模式的优点Java配置模式的缺点 Java编程配置流程配置代码案例 组件注入Bean注解配置自动扫描包路径和规则Filter常用的拦截类型FilterType.AS…

Hadoop 视频分析系统

视频分析系统 业务流程 原始数据 vedio.json {"rank":1,"title":"《逃出大英博物馆》第二集","dzl":"77.8","bfl":"523.9","zfl":"39000","type":"影视",&quo…

为什么冰酒会被视为珍品?

在某些年份,珍贵稀有的葡萄酒让酿酒师有了冒险的意愿,葡萄比平时在藤上停留更长时间,需要等待至少-7℃的温度,酿酒师需要与自然玩游戏,可以持续到1月,在罕见的情况下可以持续到2月。对于酿酒师来说&#xf…

基于鱼鹰算法的无人机航迹规划-附代码

基于鱼鹰算法的无人机航迹规划 文章目录 基于鱼鹰算法的无人机航迹规划1.鱼鹰搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用鱼鹰算法来优化无人机航迹规划。 1.鱼鹰搜索算法 …

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题,它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中,我将讲述为什么自定义用户模型是如此重要以及其潜在的优势: 随着Web应用的不断发展&…