Linux高性能服务器编程——ch3笔记

news2025/1/19 11:02:16

第3章 TCP 协议详解

3.1 TCP服务的特点

面向连接:在数据读写前必须先建立连接,并分配内核资源。全双工(读写可以通过一个连接进行)。数据交换后必须断开连接,释放系统资源。 一对一的,基于广播和多播(目标是多个主机地址)的应用程序不能使用TCP。
字节流:发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,应用程序对数据的发送和接收是没有边界限制的,在TCP发送(接收)缓冲区封装(读出)。
image.png
可靠传输:发送应答、超时重传,TCP报文段最终是以IP数据报发送的,而IP数据报到达接收端可能乱序、重复,所以TCP协议还会对接收到的TCP报文段重排、整理,再交付给应用层。

3.2 TCP头部结构

image.png
确认号:收到的TCP报文段的序号值加1。
MSS = MTU - 20 - 20

3.3 TCP连接的建立和关闭

image.png
TCP连接由客户端发起,并通过三次握手建立。
确认报文段 5 是可以省略的,因为结束报文段 6 也携带了该确认信息。
确认报文段 5 是否出现在连接断开的过程中,取决于 TCP 的延迟确认特性。
半关闭状态(shutdown函数):全双工连接,允许两个方向的数据传输被独立关闭,通信的一端可以发送结束报文段给对方,告诉它本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发送结束报文段以关闭连接。若此时客户端未等服务器关闭连接就强行退出,此时客户端连接由内核接管(孤儿连接)。
image.png
read系统调用返回0(收到结束报文段)确认对方关闭连接。
iptable命令:过滤数据包
每次超时重连时间都增加一倍。

3.4 TCP状态转移

CLOSED开始:
image.png
虚线:服务器端,listen系统调用,被动连接
实线:客户端,connect系统调用,主动连接,失败原因:1)目标端口不存在(未被任何进程监听),或者端口被处于TIME_WAIT状态的连接占用,则服务器向客户端发送一个复位报文段;2)端口存在,但超时未收到确认报文段。
image.png
报文段6后,客户端并未直接进入CLOSED,需要等待2 x MSL(TCP 报文段在网络中的最大生存时间)时间才能完全关闭。
原因:1)可靠地终止连接;2)保证让迟来的 TCP 报文段有足够的时间被识别并丢弃。
此时将无法立即使用该连接占用着的端口来建立一个新连接,因为TCP端口不能被同时打开多次。客户端一般使用系统自动分配的临时端口号来建立连接,而由于随机性,临时端口号一般和程序上一次使用的端口号(还处于 TIME-WAIT 状态的那个连接使用的端口号)不同,所以客户端程序一般可立即重启,除非强制使用上一次端口且未超时2 x MSL(考虑服务器主动关闭但异常终止,原因是使用同一知名服务端口号,可通过socket选项SO_REUSEADDR强制进程立即使用该端口)。

3.5 复位报文段

RST标志:通知对方关闭连接或重新建立连接。
1)访问不存在端口(或端口处于TIME_WAIT),复位报文段的接收通告窗口大小为0,无法回应;
2)异常终止连接,使用socket选项SO_LINGER来发送复位报文段;
3)处理半打开连接,服务器关闭连接,但是客户端网络故障没有收到结束报文段,客户端往半打开连接写入数据,服务器返回复位报文段。

3.7 TCP交互数据流

仅包含很少字节,要求高实时性,如telnet、ssh。
延迟确认:客户端针对服务器返回的数据所发送的确认报文段不携带任何数据,而服务器每次发送的确认报文段都包含它需要发送的应用程序数据,即它不马上确认上次收到的数据,而是在一段延迟时间后也看本端是否有数据需要发送,如果有,则和确认信息一起发出。因为服务器对客户请求处理得很快,所以它发送确认报文段的时候总是有数据一起发送。延迟确认可以减少发送TCP报文段的数量,而由于用户的输入速度明显慢于客户端程序的处理速度,所以客户端的确认报文段总是不携带任何应用程序数据。(TCP连接建立和断开时也可能发生)
Nagle算法:解决广域网下拥塞问题,要求一个TCP连接的通信双方在任意时刻都最多只能发送一个未被确认的TCP报文段,在该报文段的确认到达之前不能发送其他TCP报文段。另一方面,发送方在等待确认的同时收集本端需要发送的微量数据,井在确认到来时以一个TCP报文段将它们全部发出。这样就极大地减少了网络上的微小TCP报文段的数量。该算法的另一个优点在于其自适应性:确认到达得越快,数据也就发送得越快。

3.7 TCP成块数据流

长度通常为TCP报文段允许的最大数据长度,对传输效率要求高,如ftp。
当传输大量大块数据的时候,发送方会连续发送多个TCP报文段,接收方可以一次确认所有报文段。
发送方收到上一次确认后,能连续发送的TCP报文段数量取决于接收通告窗口和拥塞窗口。

3.8 带外数据

相对于普通数据(带内数据),不需要在发送缓冲区内排队,而是立即发送,telnet、ftp等远程非活跃程序会使用。
发送:设置 URG 标志,紧急指针指向数据流中带外数据的下一位置。
接收:根据紧急指针所指的位置确定带外数据的位置,并将它读入带外缓存,缓存只有1个字节。

3.9 TCP超时重传

TCP模块为每个TCP报文段都维护一个重传定时器,在报文段第一次发送时启动,超时未收到应答将重传并重置定时器。
每次重传超时时间都增加一倍(和TCP超时重连的策略相似)。在 n 次重传均失败的情况下,底层的IP和ARP开始接管,直到客户端放弃连接为止。n 与内核参数有关。

3.10 拥塞控制

提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。
image.png
拥塞控制的最终受控变量是发送端向网络一次连续写入(收到其中第一个数据的确认前)的数据量,我们称为 SWND(发送窗口=min(CWND,RWND),CWND是拥塞窗口口状态变量)。不过,发送端最终以TCP报文段来发送数据,所以SWND限定发送端能连续发送的TCP报文段数量。SMSS指TCP报文段最大数据长度。
慢启动:CWND初始为IW,发送端每收到接收端的一个确认:
CWND+=min(N, SMSS),其中 N 是此次确认中包含的之前未被确认的字节数。目的是试探性地平滑增加。
拥塞避免:当CWND超过慢启动门限(ssthresh)时,进入拥塞避免阶段,CWND线性增加,方式:1)每个RTT时间内按照上式计算新的CWND,而不论该RTT时间内发送端收到多少确认;2)CWND+=SMSSSMSS/CWND。
快速重传快速恢复
1)当收到第3个重复的确认报文段时,ssthresh=max(FlightSize/2, 2
SMSS),然后立即重传丢失的报文段,CWND=ssthresh+3SMSS;
2)之后每次收到1个重复的确认时,CWND=CWND+SMSS,此时发送端可以发送新的 TCP 报文段(如果新的 CWND 允许的话)。
3)当收到新数据的确认时,设置 CWND=ssthresh,ssthresh是第一步的值。
上述是未检测到拥塞时的策略,拥塞发生时的依据和策略:
1)重传定时器溢出=>ssthresh=max(FlightSize/2, 2
SMSS)、令CWMD≤SMSS,其中FlightSize是已经发送但未收到确认的字节数。这样之后,CWMD将小于SMSS,那么也必然小于新的ssthresh=>慢启动和拥塞避免;
2)接收到重复的确认报文段(连续3次)(原因:TCP报文段丢失,或者接收端收到乱序 TCP报文段并重排之)=>快速重传和快速恢复。

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

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

相关文章

软件考试学习笔记(希赛)

软考学习笔记-软件设计师 1. 软考基本介绍1.1 软考分数制1.2软考考试分类介绍1.3软件考试报名网站1.4考试内容1.4.1上午考试内容-综合知识1.4.2下午考试内容-软件设计 2.数据的表示2.1进制转换2.1.1R进制------》十进制转换2.1.2十进制-----》R进制转换2.1.3二进制与八进制与16…

SVM支持向量机

定义 支持向量机(SVM),Supported Vector Machine,基于线性划分,输出一个最优化的分隔超平面,该超平面不但能将两类正确分开,且使分类间隔(margin)最大 **所有训练数据点距离最优分类超平面的距离都要大于支持向量距离…

我的创作一周年纪念日

目录 机缘收获憧憬 机缘 还真是,像极了<<匆匆>>里的那一段话. “聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢&#xff1f;是他们自己逃走了罢&#xff1a;现在又到了哪里呢&#xff1f;” 一年的光景就这么过去了…

企业级API网关,金蝶是如何架构的?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/…

论文阅读之《Kindling the Darkness: A Practical Low-light Image Enhancer》

目录 摘要 介绍 已有方法回顾 普通方法 基于亮度的方法 基于深度学习的方法 基于图像去噪的方法 提出的方法 2.1 Layer Decomposition Net 2.2 Reflectance Restoration Net 2.3 Illumination Adjustment Net 实验结果 总结 Kindling the Darkness: A Practical L…

安科瑞Acrel-7000工业能耗在线监测系统,企业能源管控平台

安科瑞虞佳豪 能源管理系统采用分层分布式系统体系结构&#xff0c;对建筑的电力、燃气、水等各分类能耗数据进行采集、处理&#xff0c;并分析建筑能耗状况&#xff0c;实现建筑节能应用等。通过能源计划&#xff0c;能源监控&#xff0c;能源统计&#xff0c;能源消费分析&a…

脏数据绕过waf,Yakit爆破base64编码密码,ssh无密码登录受害主机

文章目录 waf、Yakit、ssh 技巧waf 脏数据绕过Yakit 工具对明文密码通过base64编码的格式进行爆破 SSH实操 waf、Yakit、ssh 技巧 waf 脏数据绕过 以pikachu靶场的文件上传功能为例 上传一个木马图片 显示已拦截。 找到form-data;字段加一个分号&#xff0c;中间写一些脏数…

电子器件系列49:CD4050B缓冲器

同相和反向缓冲器 还搞不懂缓冲电路&#xff1f;看这一文&#xff0c;工作原理作用电路设计使用方法 - 知乎 (zhihu.com) 缓冲器_百度百科 (baidu.com) 1、缓冲器的定义 缓冲器是数字元件的其中一种&#xff0c;它对输入值不执行任何运算&#xff0c;其输出值和输入值一样&…

Linux真的很难吗?文末送5本《Linux运维之道(第3版)》

目录 一、百度百科二、VMWare中安装centos1、下载地址2、网络适配器简介 三、克隆和快照1、克隆一般用于项目部署2、快照相当于SVN&#xff0c;是Linux系统的版本管理手段 四、XShell和Xftp1、XShell百度百科2、Xftp百度百科3、xshell7和xftp7下载地址 五、vi和vim1、vim基本编…

无管道后门(Backdoor)编写

1. 代码编写 这是基于异步套接字的后门, 利用windows提供的WSASocket API函数, 这个API和socket的区别是, 其无需等待收发完成就可以继续执行, 也就是异步的。这可实现不用管道进行收发数据。 代码: #include <WinSock2.h> #include <windows.h> #include <tc…

Leetcode 349 两个数组的交集 (哈希表)

Leetcode 349 两个数组的交集 &#xff08;哈希表&#xff09; 解法1 &#x1f60b;解法2 解法1 &#x1f60b; 自己的笨比方法:【哇这居然是标准解法之一&#xff0c;我不是笨比&#x1f60b;&#x1f60b;&#x1f60b;】 创建了两个hash数组&#xff0c;nums1出现一个就对应…

基于鹰栖息优化的BP神经网络(分类应用) - 附代码

基于鹰栖息优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于鹰栖息优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.鹰栖息优化BP神经网络3.1 BP神经网络参数设置3.2 鹰栖息算法应用 4.测试结果&#x…

华为云云耀云服务器L实例性能测评|华为云云耀云服务器L实例评测使用体验

华为云云耀云服务器L实例性能测评 文章目录 华为云云耀云服务器L实例性能测评1. 云耀云服务器L实例简介1.2 云耀云服务器与弹性云服务器区别1.3 云耀负载均衡 2. 云耀云服务器L实例购买2.1 云耀服务器L实例购买2.1.1 云耀服务器L实例初始化配置2.1.2 远程登录云耀服务器L实例 3…

【Java 进阶篇】HTML DOM样式控制详解

当我们讨论网页设计时&#xff0c;样式是一个至关重要的方面。它使我们能够改变文本、图像和其他页面元素的外观&#xff0c;从而创造出吸引人的网页。在HTML DOM&#xff08;文档对象模型&#xff09;中&#xff0c;我们可以使用JavaScript来操作和控制样式。这篇博客将详细介…

OneDrive打不开了,怎么办?使用管理员身份也无效,分享解决办法如下

文章目录 1、问题描述2、解决办法2.1 修改注册表信息2.2 修改本地组策略 1、问题描述 电脑自带的 OneDrive 突然打不开了&#xff0c;双击也没有任何反应&#xff0c;以管理员身份打开也不行。去看了好多资料才解决这个问题&#xff0c;现分享如下&#xff1b; 2、解决办法 …

计网 七层网络模型

计网 七层网络模型 一.协议&#xff08;protocol&#xff09; 1.什么是协议 数据在网络中传输时按照的规则就是协议&#xff08;protocol&#xff09; 协议&#xff08;protocol&#xff09;规定了数据在网络中传输的顺序&#xff0c;格式&#xff0c;以及携带哪些内容 二…

【解决】运行vue项目,启动报错 in ./node_modules/@intlify/core-base/dist/core-base.cjs

我的处理方式: 一开始查了好多方法&#xff0c;删除node_modules&#xff0c;重新安装&#xff0c;切换node版本等&#xff0c;但是发现并没有用 之后来发现是安装依赖包的时候有些包安装失败导致的&#xff0c;只要有针对性的重新安装依赖就可以了 例如&#xff1a; in ./n…

【vue2.x】如何快速实现每个月倒计时

代码一 //获取这个月最后一天getLastDay(){var year new Date().getFullYear(); //获取年份var month new Date().getMonth() 1; //获取月份var lastDate new Date(year, month , 0).getDate(); //获取当月最后一日month month < 10 ? 0 month : month ; //月份补 0…

6 个可解锁部分 GPT-4 功能的 Chrome 扩展(无需支付 ChatGPT Plus 费用)

在过去的几个月里&#xff0c;我广泛探索了 ChatGPT 的所有可用插件。在此期间&#xff0c;我发现了一些令人惊叹的插件&#xff0c;它们改进了我使用 ChatGPT 的方式&#xff0c;但现在&#xff0c;我将透露一些您需要了解的内容。 借助 Chrome 扩展程序&#xff0c;所有 Chat…

深度学习(生成式模型)——DDPM:denoising diffusion probabilistic models

文章目录 前言DDPM的基本流程前向过程反向过程DDPM训练与测试伪代码 前向过程详解反向过程详解DDPM损失函数推导结语 前言 本文将总结扩散模型DDPM的原理&#xff0c;首先介绍DDPM的基本流程&#xff0c;接着展开介绍流程里的细节&#xff0c;最后针对DDPM的优化函数进行推导&…