【计算机网络】Tcp详解
文章目录
- 前言
- Tcp协议段格式
- TCP的可靠性
- 面向字节流
- 应答机制
- 超时重传
- 流量控制
- 滑动窗口(重要)
- 拥塞控制
- 延迟应答
- 捎带应答
- 标志位
- 具体标志位
- 三次握手
- 四次挥手
- 粘包问题
- TCP异常情况
- listen的第二个参数
前言
前面我们学习了传输层协议Udp,今天我们一起学习Tcp,Tcp比Udp复杂,但可靠,非常多的场景需要这种可靠。
Tcp协议段格式
只从格式来看,Tcp就比Udp复杂许多,那么Tcp的报头和有效载荷应当如何分离?
首先,报头前20个字节一定是固定的,我们先提取前20个字节,找到4位首部长度
然后,首部长度 * 4 -20,来查看是否有选项
最后,读完选项的字节,剩下的就是数据。
TCP的可靠性
大量丢包,乱序,重复,校验失败,发送缓慢,网络故障,都是不可靠的表现,正是因为传输距离变长,才会引发如此多的可靠性问题,为了解决这些问题。TCP引入了应答进制。
假如C给S发送了一条数据,只有当S给C了应答,C才认为自己的数据已经送到了S的手里,如果等待一段时间后没有收到这个应答,C就会认为自己发送的数据丢失了,会触发超时重传。
为了提高发送的效率,多个TCP报文会同步传送,这也就导致到达对端的数据没有顺序,而乱序正是我们要可靠问题,所以TCP报文注定是有编号的
面向字节流
应用层将数据拷贝到TCP的发送缓冲区,以 uint8 为一个单位将整个发送缓冲区划分。所以发送缓冲区天然带编号(数组下标)。
应答机制
上面我们知道TCP需要应答和编号,应答其实就是一个TCP报文中携带了ACK字段,而32位序号就是我们所说的编号,对端需要针对这个序号对我们做出ACK应答。
例如:C端发出了32位序号为10的报文,S端就要返回一个32确认编号为11的报文
发送序号:当前报文的编号。
确认序号:表示前面的报文已经全部收到,接下来应该从这个序号开始发送了。
由于Tcp报文具有捎带应答机制,即S发送ACK的时候,也有想要发给C的信息,所以必须设计为两个独立字段,而不能复用在一起。
超时重传
数据丢失的两种可能性:
1、数据半路真的丢包了
2、数据没有丢包,但ACK半路丢了
第一种情况,必然需要我们重传数据,也就要求TCP必须能做到暂时保存这些数据,以支持重传。
第二种情况,可以参考其他的ACK,因为如果只是ACK丢失,其他ACK的确认序号不会变。
等待时间:各个平台不同,在linux下以500ms为基准,n*500的方式动态调整。
流量控制
TCP具有接收缓冲区和发送缓冲区,也是全双工的,但只要是缓冲区就有大小,设想一下这样的场景:
C将报文送到了S,但S的接收缓冲区放不下了。在这种情况下,S只能丢弃掉来的报文,并不做应答,过一段时间,C会进行重传操作。
仔细一下就会发现这样是十分低效的,报文千里迢迢赶到对端主机,却因为对端没法接收而被丢弃,为了解决这个问题,TCP报文有一个叫做16位窗口大小的字段,这个字段填充自己的接收缓冲区的大小,对方拿到报文时就会看到这个大小,并根据此大小调整(增大或减小)发送数据的速度、大小。
窗口探测:
双端会定期向对方发送不携带数据的TCP报文,以此来询问对方的接收能力,调整自己发送数据的速度和大小(这个过程是双向的)
滑动窗口(重要)
TCP协议,可靠性是主要的研究问题,但效率问题,也是TCP需要考虑的问题。
发送方并发发送,一定要在对方能够接收的前提条件下,才能进行并发发送。
1、一般情况
一个发送缓冲区就被滑动窗口划分成了三个区域。
左边的区域:已经发送,且已经确认的数据——可以被覆盖的
中间的区域:可以直接发送(大小限制),但尚未收到应答
右边的区域:尚未发送的数据区域
滑动窗口的大小,应该与与对方的接收能力有关。
1.5、如何理解滑动窗口
2、特殊情况
1、滑动窗口只能向右,因为左边的数据已经没有了意义
2、变大变小本质是在调整winend,取决于对方的窗口大小,滑动窗口是浮动的
3、变成0,说明对方不能接收数据了(进行窗口探测,窗口通知)
4、应答也要按序到达
应答编号:winstart = seq;
应答窗口大小:winend = winstart + win;
5、丢失问题
a、第一个丢失了
重传补发
b、中间的丢失了
向右滑动,又变成了第一个丢失
c、最后一个丢失
也会变成最左侧丢失
快重传:(高速重发)
当某一个报文丢失,连续收到了三个一样的确认应答后,立马进行重传。
重传的下限:超时重传
重传的上限:快重传
拥塞控制
如果网络出现问题,TCP也进行了策略控制。
同样都是丢包,丢少和丢多也是不一样的,如果一直在丢包,那就是网络的问题。
当大量丢包的时候,发送方的发送策略是 等等再发!!
如果网络出现瘫痪的时候,所有主机再次重传,会让瘫痪的网络更难以恢复,所以我们采用的策略是,如果发现了网络拥塞,要减少发送量。总的来说要符合以下两点要求:
1、保证网络拥塞不能加重
2、在网络恢复有起色时,尽快恢复网络通信
TCP引入了 慢启动 机制:
发生了网络拥塞,发送方要基本得知网络拥塞的严重程度,必须进行网络状态的探测
拥塞窗口
需要对网络状况进行衡量——拥塞窗口
网络状态时变化的,衡量网络健康状态,即拥塞窗口的大小一定是变化的。
因此发送方的滑动窗口 = min(16位窗口大小,网络的拥塞窗口)
拥塞窗口的增长速度是指数级别的,慢启动指的是前期慢,后期增长速度非常快。
1、慢启动有一个阈值
2、当拥塞窗口超过这个阈值后,不再指数增长,而是按线性增长
3、每次超时重发的时候,慢启动阈值(ssthresh)会变成原来的一半,同时拥塞窗口置为1(乘法减少)
延迟应答
立即返回ACK应答,返回的窗口大小可能会比较小。
给对方通告出更大的win大小,对方就能在更大概率上提高传送效率。给上层更多时间来读取,在这段时间尽快读取,且读取更多。
捎带应答
ACK搭顺风车。
标志位
- 标志位的本质
一个二进制位,来标识不同类型的报文
- 为什么要有标志位
不同的标志位提供不同的服务。
具体标志位
ACK:确认应答报文,可能携带数据(捎带应答)
SYN:连接请求的报文(三次握手)
FIN:连接断开的报文(四次挥手)
PSH:提示对方应用层尽快将缓冲区数据取走(多路转接
)
RST:告诉对方要重新连接(连接被重置了)
URG:按序到达,但我们想插队?(紧急数据)16位紧急指针,紧急数据在有效载荷中的偏移量。紧急数据(带外数据)只有一个字节。(下载取消案例)recvfrom的MSG_OOB选项。
三次握手
-
1、什么是连接?
一个OS内一定右多个建立好的连接,OS必须要把这些连接管理起来。
维护连接是有成本的,必然要消耗CPU、内存资源。 -
2、为什么是三次?
三次握手过程,由双方操作系统在TCP自主完成
connect:触发连接,等待完成
accept:等待建立完成,获取连接对于客户端来说,只要发出了最后一个ACK,就认为链接已经建立好了。
对于服务端来说,只有收到了最后一个ACK,服务器才消耗资源构建。因此,三次握手本质在赌服务端的确收到了最后一个ACK。假如没有收到ACK,两者建立认知不一致了,这时候客户端再给服务端发消息,服务端就会回复一个RST,进行连接重置
- 如果两次握手,只要发出SYN+ACK就得浪费资源构建。容易被
SYN洪水攻击
。注意,TCP本身并不考虑解决安全问题,但TCP不能出现安全漏洞!因此需要规避SYN洪水。 - 如果大于3次握手,仍然解决不了最后一个ACK问题,如果是偶数次握手,最后一个ACK是服务器端承担风险、奇数次握手是客户端承受风险。而服务器端保存着大量的数据,出现异常是必然的,固而两次以及偶数握手是不妥的
- 3次握手的好处:
1、没有明显漏洞,出现异常,成本嫁接到客户端
2、验证双方通信信道通畅情况,是验证流畅(全双工)的最小成本(收、发)
- 如果两次握手,只要发出SYN+ACK就得浪费资源构建。容易被
-
3、状态变化
SYN_SENT:同步发送
SYN_RCVD:同步收到
ESTABLiSH:建立完成
四次挥手
四次挥手,是双方建立连接断开共识的最小成本!必须要双方同意(都不发消息)!
状态变化:
当客户端退出,服务器端不调用close的时候,服务端进入CLOSE_WAIT状态,服务端进入FIN_WAIT2的状态。
一段时间后,客户端的FIN_WAIT2消失,服务端仍是CLOSE_WAIT状态。所以,对于服务器端,要关掉文件描述符!
调用close后,服务器端立马进入LAST_ACK状态,并发送FIN给对端,如果对端已经关闭,在经历几次重传后,服务器端也会断开连接。
主动断开的一方,要进入TIME_WAIT状态,此时立马想要重启,会失败,原因是底层连接还在,正处于TIME_WAIT状态。
-
1、为什么要进入TIME_WAIT
TCP协议规定,主动断开连接的一方,要等待两个MSL时间(一个报文在网络里存在的最大时间),
- 1、让网络中的报文尽快消散,防止对新的连接产生影响。
- 2、保证最后一个ACK让对方收到。对方如果没收到最后一个ACK,会再发送FIN。
-
2、如果server不想等待
//设置地址可以复用,令服务器立马重启 setsockopt(int sockfd,int level,int optname,const void* optval,socklen_t optlen) 参数: sockfd:套接字 level:当前在哪一层(SOL_SOCKET) optname:(SO_REUSEADDR | SO_REUSEPORT) optval:1 optlen:len
粘包问题
TCP没有UDP里面的报文长度字段,我们并不知道两个数据的边界,这样的问题就是粘包问题
解决:明确两个包之间的边界(上层去完成)。
TCP异常情况
进程终止/机器重启:进程终止会释放文件描述符,仍然发送FIN,和正常关闭一样(操作系统回收所有相关资源)
机器掉电/网线断开:对端认为连接还在,一旦接收端有写入操作,发现连接不在了,就会reset,服务器发送保活定时器,发送端也可reset
listen的第二个参数
设置第二个参数为1,连接服务器,一定程度后,进入SYN_RECV,即已经建立好的链接只能是两个。
TCP协议,需要在底层维护全连接队列,最大长度为:第二个参数 + 1
将没有连接到半连接队列,时间非常断。
全连接队列不能太长,也不能没有。全连接的长度不是服务器处理的长度,而是一个 “排队” 的地方.
1、会消耗过多的OS资源,不如给server使用
2、尾部等待太长。
相关文章:
【计算机网络】Tcp详解
文章目录 前言Tcp协议段格式TCP的可靠性面向字节流应答机制超时重传流量控制滑动窗口(重要)拥塞控制延迟应答捎带应答标志位具体标志位三次握手四次挥手粘包问题TCP异常情况listen的第二个参数 前言 前面我们学习了传输层协议Udp,今天我们一…...
最简单的laravel不使用任何扩展导出csv
php导出csv是非常常用的操作,网上也有灰常多的扩展。如果只是单纯的导出csv数据,完全没有必要去用扩展。现在做项目,都是代码能少就少,扩展能不用就不用。好了,不废话了,开干! 直接搞一个方法&…...
Android studio 断点调试、日志断点
目录 参考文章参考文章1、运行调试2、调试操作3、断点类型行断点的使用场景属性断点的使用场景异常断点的使用场景方法断点的使用场景条件断点日志断点 4、断点管理区 参考文章 参考文章 1、运行调试 开启 Debug 调试模式有两种方式: Debug Run:直接…...
服务器数据恢复-热备盘同步过程中硬盘离线的RAID5数据恢复案例
服务器数据恢复环境: 华为OceanStor某型号存储,11块硬盘组建了一组RAID5阵列,另外1块硬盘作为热备盘使用。基于RAID5阵列的LUN分配给linux系统使用,存放Oracle数据库。 服务器故障: RAID5阵列1块硬盘由于未知原因离线…...
Python 使用input获取用户输入
视频版教程 Python3零基础7天入门实战视频教程 input()函数用于向用户生成一条提示,然后获取用户输入的内容。由于input()函数总会将用户输入的内容放入字符串中,因此用户可以输入任何内容,input()函数总是返回一个字符串。我们可以通过int(…...
Python 可迭代对象、迭代器、生成器
可迭代对象 定义 在Python的任意对象中,只要它定义了可以返回一个迭代器的 __iter__ 魔法方法,或者定义了可以支持下标索引的 __getitem__ 方法,那么它就是一个可迭代对象,通俗的说就是可以通过 for 循环遍历了。Python 原生的列…...
HTML的有序列表、无序列表、自定义列表
目录 背景: 过程: 有序列表: 简介: 代码展示: 效果展示: 无序列表: 简介: 代码展示: 效果展示: 自定义列表: 简介: 代码展示: 效果展示: 总结: 背景: 1.有序列表(Ordered List): 有序列表是最早的…...
银河麒麟安装Docker-国产化-九五小庞
银河麒麟高级服务器操作系统 V10 是针对企业级关键业务,适应虚拟化、 云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩展性和 实时性的需求,依据 CMMI 5 级标准研制的提供内生安全、云原生支持、国产 平台深入优化、高性能、易管理的…...
数据库与身份认证
1. 数据库的基本概念 1.1 什么是数据库 数据库(database)是用来组织、存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息…...
LabVIEW开发锅炉汽包水位的监督控制和模拟
LabVIEW开发锅炉汽包水位的监督控制和模拟 控制锅炉汽包液位对于机械的安全和设备的保护至关重要。滚筒液位控制器的工作是将滚筒液位提高到指定的设定点,并保持在那里,同时保持一致的蒸汽负荷。锅炉管可能会因该水平急剧下降而暴露,这会导致…...
2023-简单点-树莓派安装ncnn框架
not python 按照下面的步骤进行就可以了: 参考 tips: 其中有一步要用下面方法: 如果你的git clone不得行,可以按照以下操作方法: git clone --depth1 https://ghproxy.com/ https://github.com/Tencent/ncnn.git python 直接 pip install …...
Docker核心原理与实操
第一章、Docker基本概念 1、概念:Docker是一种容器技术,可以解决软件跨环境迁移问题。 2、实现原理:是一个分层复用的文件系统;每一层都是一个独立的软件; …...
虚幻引擎 UE5 增强输入系统
用人话讲!虚幻引擎 UE5 增强输入系统(蓝图篇)_酥妃大魔王i的博客-CSDN博客 UE5 -- EnhancedInput(增强输入系统) - 知乎 (zhihu.com) 简单认识 虚幻引擎中的增强输入 | 虚幻引擎5.1文档 (unrealengine.com) 文档有较详细介绍 标记一下方便…...
Mac 安装软件各种报错解决方案
Mac 安装软件各种报错解决方案 文章目录 Mac 安装软件各种报错解决方案一. 打开允许“允许任何来源”二. 无法打开"xxx",因为它不是从App Store下载三. 无法打开"xxx",因为 Apple无法检查其是否包含恶意软件。四. "xxx"已…...
leetcode做题笔记142. 环形链表 II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整…...
DuDuTalk:4G语音工牌,如何实现家庭上门维修服务过程的智能化管理?
随着上门按摩、上门养老、上门买菜、上门维修等互联网上门服务的兴起,越来越多的居民开始采用线上下单,享受企业安排人员上门到家的服务。而家庭维修作为到家服务里面典型的一个场景,已成为许多人不可或缺的一部分。然而,与此同时…...
Mybatis常见面试题总结
梳理面试过程中Mybatis相关的常见问题。为保证知识点覆盖,参考了《Mybatis从入门到精通》、《深入浅出Mybatis技术原理与实战》、《Mybatis技术内幕》等书籍。 Mybatis 简介 Mybatis 是一款优秀的持久层框架(ORM框架),它支持自定义SQL、存储过程以及高…...
数字IC设计之时序分析基础概念汇总
1 时钟Clock 理想的时钟模型是一个占空比为50%且周期固定的方波。时钟是FPGA中同步电路逻辑运行的一个基准。理想的时钟信号如下图: 2 时钟抖动Clock Jitter 理想的时钟信号是完美的方波,但是实际的方波是存在一些时钟抖动的。那么什么是时钟抖动呢?时钟抖动&#…...
1.centos7安装docker
本文目录: 1.docker 安装1.安装步骤2.安装是否成功校验3.docker加速配置4.hello world来袭,验证安装是否ok 2.卸载docker3.卸载较旧版本docker 使用docker必备的三个官方网站: docker官网:https://www.docker.com docker官方仓库&…...
基于elasticsearch-8.8.2 kibana-8.8.2 搭建一个文搜图系统demo
数据来源是由 图片url,图片descript,图片keywords 外加一个id 基于此首先创建 索引, keywords是一组由单词或词组 组成的一组数据,所以以数组形式压入数据: descript 是由两条语句组合成的数据(针对图片的两种不同描述) # 这里创建的keywords 数组元素类型为text,即可以模糊匹…...
第26节-PhotoShop基础课程-形状工具组-画板
文章目录 前言1.基础图形1.正方形(shift/alt/两者加起来)2.描边3.合并形状 将多个图放在一个图层4.对齐只能在不同图层5.修改6.重叠,相交 2.多边形1.边数2.星形 3.直线工具1.正常2.箭头 4.自定义形状 前言 类似画图板,矢量图形。…...
第一次课,通过进程信息和服务信息识别当前计算机运行程序(预习版)
题目: 检测的目标进程: ydebugg ; “ImmunityDebugger.exe” _500], rax Exe ; “ollydbg.exe” _4F8], rax hackerE ; “ProcessHacker.exe” _4F0], rax Exe ; “tcpview.exe” _4E8], rax sExe ; “autoruns.exe” _4E0], rax scExe ; “autorunsc.ex…...
ChatGPT 或其它 AI,能用在文书创作上吗?
新的申请季已经正式开始,一些热门项目的ED截止日期也不再遥远,因此很多准留学生们都已经开始了关于文书的创作。 而随着科技的不断发展,以ChatGPT为首的一众AI工具也作为一种辅助手段愈发融入了我们的生活。 那么不免就会有一些同学在准备申…...
Java中锁的分类
Java中锁的分类 这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性&am…...
centos安装flink,通过windows访问webui
1. 安装flink 1.1. flink的下载 通过flink官网下载flink安装包 https://flink.apache.org/ 下载安装包 1.2 flink在centos上的安装 将下载好的flink-1.17.1-bin-scala_2.12.tgz安装包放到centos目录下 解压文件: [rootlocalhost ~]# tar -zxvf flink-1.17.…...
如何让两台手机相互远程控制?
你的两台手机是什么系统的?如果你的两台手机都是安卓系统,而且都是安卓7.0及以上版本的系统,那么恭喜你,这两台手机可以相互远程控制! 你可以利用两个软件实现将两台手机相互远程控制的想法。为了避免混淆,…...
预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 预编译防止SQL注入 1、SQL执行过程2、预编译原理3、…...
【7z密码】7z压缩包密码忘记了,怎么办?i
7z压缩包设置了密码,解压的时候就需要输入正确对密码才能顺利解压出文件,正常当我们解压文件或者删除密码的时候,虽然方法多,但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么,忘记了7z压缩包的密码…...
部署云MYSQL(在线版)
在Methodot - 您的一站式云原生在线开发协作平台网站上可以部署免费的MYSQL,在应用商店里能看到可以搭建多种数据库:(前提是要注册登录,免费版只能是2人共享) 登陆好后,点击工作台,选择应用商店…...
Gin 框架 解决 跨域问题
Gin 框架解决跨域问题 一点废话 在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的,然后又刚好会一点点 go,就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json 。 这是我的go代码…...
公司网站制作公司排名/企业品牌营销推广
点击关注公众号,Java干货及时送达授权转自:OSCHINA,作者:局长 原文:https://www.oschina.net/news/135658/db-engines-ranking-202104DB-Engines 4 月份流行度排行已更新,基于 3 月份的整体数据变化。从总榜…...
视频直播网站开发流程/如何提高网站排名seo
1、转换图片格式要用到一个叫做ImageMagick的软件,安装后,进入控制台(运行-->cmd),进入图片所在目录,以a.bmp文件为例,convert a.bmp fig1.eps2、编辑.tex文件加入包\usepackage{graphicx}\usepackage{float}插入图…...
企业网络搭建与应用试题及答案/seo兼职招聘
1 冒泡排序 BubbleSort 1.1 原理: 多次扫描整个数组,每次扫描都比较相邻两个元素,如果逆序,则交换两个元素。 第一次扫描结果是数值最大元素到数组的最后位置,比较的次数是n(数组长度)-1。 第二次扫描,因为…...
怎么在网站底部做备案号/微信引流用什么软件好用
MySQL安装说明 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System&…...
北京网站制作17页/老鬼seo
[NOIP2016]天天爱跑步 时间限制:2 s 内存限制:512 MB 【题目描述】 小C同学认为跑步非常有趣,于是决定制作一款叫做《天天爱跑步》的游戏。《天天爱跑步》是一个养成类游戏,需要玩家每天按时上线,完成打卡任务。 这个…...
wordpress 301定向/如何做好网络营销管理
舵机 舵机是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的基准信号,将获…...