6、传输层TCP28

news2025/1/11 2:01:31

TCP协议:传输控制协议

1、协议实现

  • 16位源端端口&16位对端端口:描述通信俩端进程
  • 32位序号:告诉接收端,这条数据在整体数据中的排序,接收端根据序号进行排序
  • 32位确认序号:向发送端进行回复确定,确认序号之前的数据都已经收到
  • 4位头部长度:以4字节为单位描述tcp报文头部长度,tcp报头最长是60字节,最小20字节。
  • 6位保留:暂时未使用
  • 6位标志位:FIN,SYN,RST,PUSH,ACK,URG
  • 16位窗口大小:用于实现滑动窗口机制,进行流量控制
  • 16位校验和:二进制反码求和算法,校验数据一致性
  • 16位紧急指针:指向带外优先数据的结束位置
  • 0~40字节选项数据:通常是一些额外的协商信息

2、tcp协议特性

面向连接,可靠传输,面向字节流传输服务

2.1面向连接

通信前,要先建立连接,确保双方都是在线,具有数据收发的能力。

连接管理:三次握手建立连接,四次挥手断开连接。

2.1.1三次握手

通信前,要先建立连接,确保双方都是在线,具有数据收发的能力。

2.1.2四次挥手

通信结束后,会有一个断开连接的过程,避免出现意外。

FIN请求的功能: 只能表示不再给对方发送数据,不代表不接受数据

CLOSE_WAIT:等待关闭,对方发送了FIN包,已经不再给自己发送数据,上层如果这时候还在继续recv,则会读完缓冲区数据后,不再阻塞,而是返回0.这种情况下就是等待上层针对这种情况的处理。

2.1.3问题

2.1.3.1为什么握手是三次?

握手三次:俩次不安全,四次没必要

1.通信前,要先建立连接,确保双方都是在线,具有数据收发的能力。因此都要SYN

2.俩次不安全:

  • 有可能SYN会延迟到达,与重发的SYN形成冲突(三次有状态要求)
  • 防止恶意攻击,比如客户端发送SYN后就直接退出

3.四次没必要:没必要发送俩次报文,在一次回复中将对应比特位置置1即可

2.1.3.2 挥手是四次?

FIN请求只能表示主动关闭方不再发送数据,不代表不再接收数据。因此,被动关闭方收到FIN包并进行确认后,还有可能会继续发送数据。等待上层不再发送数据了,也要关闭套接字了才会发送FIN包。

因此挥手没有合并为三次。

2.1.3.3 三次握手失败,俩端如何处理?

  1. 客户端发送第一次握手请求失败了,客户端会重传请求SYN。
  2. 第二次握手失败服务端回复的ACK + SYN丢失,客户端会重传,服务端在等待对方ACK回复超时后,给客户端发送一个RST报文,然后释放资源。
  3. 第三次握手失败,服务器超时,回复RST,然后释放资源。

2.1.3.4 一台主机出现了大量的CLOSE_WAIT状态连接,是什么原因?

  1. 只有收到FIN请求并进行了确认回复的连接会进入CLOSE_WAIT状态
  2. 一直处于CLOSE_WAIT而没有进入下一个状态,是因为上层没有进行关闭套接字操作,也就是没有发送FIN,所以没有进入下一步
  3. 因此原因就是代码中没有针对断开连接的套接字进行关闭处理

2.1.3.5 TIME_WAIT状态有什么用,为什么不直接关闭套接字释放资源?

  1. TIME_WAIT状态是主动关闭方在发送最后一次ACK后进入的状态
  2. 如果没有TIME_WAIT,主动关闭方直接释放套接字资源,有可能出现新启动的套接字使用了与之前相同的地址信息
  3. 而上次通信可能最后一次ACK丢失,一旦丢失被动关闭方会重传FIN
  4. 就会导致上一次通信因为最后一次ACK丢失,而遗留问题(重传FIN)对新连接造成影响

因此不能直接释放资源,需要等待俩个MSL时间,针对有可能存在的FIN重传进行处理,并保证上一次通信的所有数据都消失在网络中。

MSL:报文最大生命周期,一个报文在网络中最大能存在的时间。默认60s

2.1.3.6 一台主机上出现了大量TIME_WAIT状态连接,是什么原因?怎么处理?

  • TIME_WAIT是状态是主动关闭方在发送最后一次ACK后进入的状态,等待一段时间是为了处理有可能因为FIN丢失导致的FIN重传的处理
  • 因此一台主机出现大量的TIME_WAIT连接,是因为主机上大量的主动关闭了连接,常见于爬虫服务器
  • TIME_WAIT等待时间是可以配置的,可以将时间缩短
  • 有个套接字选项,叫做地址重用:setsockopt();

2.1.3.7 tcp连接管理中的保活机制

连接断开有个信息:recv会返回0,send会触发异常SIGPIPE

tcp通信中,如果客户端和服务端的通信频率并不高,中间突然断网了,没有四次挥手的机会,如果俩端通信频率很低,可能需要很久才能发现。

在通信中,客户端与服务器若长时间无通信(默认7200s),则tcp服务器会自动向客户端发送保活探测心跳包,要求对方进行响应(默认每隔75s),若连续多次都没有收到响应(默认9次),则认为断开连接。

这些数据都可配置。甚至可以用套接字选项设置。

通常网络通信程序,在初始化阶段都会自定义SIGPIPE信号。

2.2可靠传输(通过很多特殊机制实现)

  1. 面向连接——确保双方都具有数据收发能力
  2. 丢包检测机制(确认应答机制)——接收方要针对收到的每一条数据进行确认回复
  3. 丢包重传机制(超时重传机制)——等待确认回复超时则重传
  4. 序号字段——进行包序管理,有序交付
  5. 校验和字段——校验数据一致性,不一致则丢弃,要求重传

tcp为了实现可靠传输使用了很多机制,但是这些机制影响了tcp的传输性能,但是有些性能损失是可以挽回的:

  1. 比如确认应答丢失所导致的重传就没有必要
  2. 比如发送方数据过多,超过了接收方的上限,导致数据溢出丢包
  3. 比如因为网络状态拥塞时发送数据过多导致丢包

2.2.1 滑动窗口机制:流量控制

2.2.1.1 作用

通过协议字段中的窗口大小字段,接收方告诉发送方最大的发送数据量,避免因为发送数据过多,而自己缓冲区不够,导致溢出丢包。窗口大小字段中的值不能大于接收方接收缓冲区中剩余空间的大小。

2.2.1.2 实现

MSS:最大数据段大小,表示在tcp传输中,应用层数据最大大小

在三次握手阶段,tcp通信双方就会进行协商。

MTU:最大传输单元大小,是链路层限制的最大数据帧大小。

 TCP在使用send发送数据的时候,是把数据放到发送缓冲区中,系统选择合适的时候,从发送缓冲区中取出合适长度大小(不大于MSS)的数据,封装报头进行发送。

2.2.1.3 特殊协议

  1. 停等协议:发送一条数据后,必须等到确认回复才会发送下一条
  2. 回退n步协议(针对网络一般):发送一条数据后,若丢包,则将丢包的数据及其往后的数据都进行重传
  3. 选择重传协议(针对网络好):管线化传输,哪条丢了就重传哪条

2.2.2 快速重传协议

在连续传输过程中,接收方会按序响应。如果某个确认应答丢了,也没事,因为后面的数据确认应答也能表示前面的数据已经收到了,(基于确认序号的作用)避免因为确认应答丢失而导致的重传。

在连续传输过程中,如果某个数据包丢了。

就是说在传输过程中,接收窗口起始序号位置的数据没有收到,而是收到了后面的数据,这时候就可以认为前边数据有可能丢失。这时就可启动快速重传协议。

收到了后面的数据,但是没有收到前面的数据,则每收到一条数据就会确认回复一下前面没有收到的那条数据的序号,表示让对方对这条数据进行重传。

但是发送方,收到了前边的数据的确认序号应答,不会立即对这条数据进行重传,而是连续收到三次后才会重传。避免前面数据这是延迟到达而不是丢了的情况。

2.2.3 拥塞机制

避免因为网络拥塞而导致大量丢包。实际上就是一种网络探测式的传输。

1拥塞窗口以指数级进行增长:1,2,4,8,16.......

2增长过程中,一旦出现了超时重传请求:

  • 阈值变为当前窗口的一半大小,窗口从1重置
  • 当拥塞窗口达到阈值大小时,变为线性增长,每次+1 

 3增长过程中,一旦出现了快速重传请求

  • 拥塞窗口变为当前窗口的一半
  • 阈值变为拥塞窗口+3

 拥塞控制就是慢启动,块增长的形式实现网络状况探测,避免因为网络拥塞而导致是大量丢包。

 3、其他提升性能的方式

  1. 延迟发送机制:数据先放到缓冲区,延迟一段时间再发送(减少IO次数)
  2. 延迟应答机制:收到数据后,延迟一段时间再确认回复(维持吞吐量)
  3. 捎带应答机制:将确认回复与即将要发送的数据一起合并发送
  4. 快速重传协议:尽量减少超时等待

4、面向字节流

提供的是字节流传输服务

流式传输:是一种有序的,安全的,可靠的,基于连接的字节流传输

字节流传输:发送或接收最小单位为字节的传输方式。

过程:方式方将要发送的数据放到发送缓冲区中,系统会截取合适大小的数据进行传输。接收方将接收到的数据,放到接收缓冲区中,上层recv要多少就多少。

字节流传输是比较灵活的,没有发送或者接收的长度限制。

4.1问题:粘包问题

4.1.1定义

将多条数据当作一条数据进行处理(俩个包粘在一起当作一个包了)

4.1.2本质原因

tcp对上层数据的边界不做特殊处理,没有数据之间的边界管理

4.1.3解决方法

1.数据之间以特殊字符作为间隔

优点:思想简单

缺点:数据中不能有特殊字符,需要编码

2.数据定长

优点:思想简单

缺点:数据小了浪费性能,数据大了不够

3.采用TLV数据格式:type,length,value

发送每条数据都有一个固定的头部:type,length

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

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

相关文章

pytest-html报告修改与汉化

目录 前言 生成报告 测试代码 原始报告 修改Environment 修改后的效果 修改Summary 修改后的效果 修改Results 优化Test 解决中文乱码 删除多余部分 修改后的效果 删除Links 修改后的效果 增加失败截图与用例描述 完整的conftest.py代码 汉化报告 修改plugin…

ClickHouse进阶

一、Explain查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到,并且只能真正执行 sql,在执行日志里面查看。 在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成为正式版本的功能。 …

常见的JS内置对象——字符串、数学、日期

二、字符串(string) 创建 一般使用第一种方式 2)字符串的遍历 注意:没有foreach方法 3)字符串的常见方法 substr()和substring(): substr()参数是从哪个位置开始,截多长 substring()参数是从…

完美匹配:一种简单的神经网络反事实推理学习表示方法

英文题目:Perfect Match: A Simple Method for Learning Representations For Counterfactual Inference With Neural Networks 翻译:完美匹配:一种简单的神经网络反事实推理学习表示方法 单位: 论文链接:https://a…

【状态估计】基于FOMIAUKF、分数阶模块、模型估计、多新息系数的电池SOC估计研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C++ 创建共享内存

共享内存用于实现进程间大量的数据传输&#xff0c;共享内存是在内存中单独开辟一段内存空间&#xff0c;这段内存空间有自己特有的数据结构&#xff0c;包括访问权限、大小和最近访问时间等。 1、shmget函数 #include <sys/ipc.h> #include <sys/shm.h> int shm…

c++——多态(补充)

优先查看&#xff1a;c——多态_Hiland.的博客-CSDN博客 目录 菱形虚拟继承子类的重写问题 菱形虚拟继承中的偏移量补充 逆向思维——汇编查看多态中被重写的虚函数 菱形虚拟继承子类的重写问题 继承环节时&#xff0c;菱形虚拟继承解决了菱形继承的数据冗余和二义性问题。…

C# Modbus通信从入门到精通(11)——Modbus RTU(调试软件Modbus Slave和Modbus Poll的使用)

前言 我们在开发Modbus程序的时候,会需要测试以下我们写的Modbus程序有没有问题,这时候就需要使用到Modbus Slave和Modbus Poll这两个软件,Modbus Slave是模拟Modbus从站,Modbus Poll是模拟Modbus从站主站的, 1、Modbus Slave 一般情况下我们开发的嗾使Modbus主站程序,…

性能测试(Jemeter)

1.性能指标 响应时间&#xff1a;一次请求的往返时间tps&#xff1a;每秒系统能够处理的事务数&#xff0c;比如订单中的下单操作&#xff0c;下单后续有很多操作&#xff0c;比如创建订单&#xff0c;扣除库存&#xff0c;清算库存等&#xff0c;这个完整操作就是一个完整的事…

【数据分享】1929-2022年全球站点的逐日最大持续风速数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

Qt添加第三方字体

最近开发项目时&#xff0c;据说不能用系统自带的微软雅黑字体&#xff0c;于是找一个开源的字体&#xff0c;思源黑体&#xff0c;这个是google和Adobe公司合力开发的可以免费使用。本篇记录一下Qt使用第三方字体的方式。字体从下载之家下载http://www.downza.cn/soft/266042.…

Pytest参数化——那些你不知道的使用技巧

目录 前言 装饰测试类 输出 说明 装饰测试函数 单个数据 输出 说明 一组数据 输出 说明 图解对应关系 组合数据 输出 说明 标记用例 输出 说明 嵌套字典 输出 增加可读性 使用ids参数 输出 说明 自定义id做标识 输出 说明 总结 总结&#xff1a; 前…

给你二叉树的根节点 root ,返回它节点值的中序遍历

题目&#xff1a;给你二叉树的根节点 root &#xff0c;返回它节点值的中序遍历。 要求&#xff1a;非递归实现。 1/ \2 3/ \ / \4 5 6 7中序遍历结果为&#xff1a; 4 2 5 1 6 3 7这里考察中序遍历思想&#xff0c;使用Stack的后进先出特性输出结果。 TreeNode树状结…

spring项目的创建和使用(详细教程 手把手)方法一

今天我们来讲使用maven方式创建一个sping项目。 1、创建一个普通的maven项目。 2、添加spring框架(引入依赖)支持。添加到pom.xml文件中。 添加的框架有 spring-context&#xff1a;spring 上下⽂&#xff0c;还有 spring-beans&#xff1a;管理对象的模块。 <dependenc…

python将.h5文件转换成csv

五、在jupyter中找到results文件夹&#xff0c;然后可以把跑的.h5结果转换为csv文件 pip install tables import h5py import numpy as np import pandas as pd filename Mnist_FEDL_0.003_0_10u_20b_5_avg.h5 f h5py.File(filename, r) # List all groups print("K…

SpringMVC【文件上传(原生方式上传、上传多文件、异步上传、跨服务器上传 ) 】(五)-全面详解(学习总结---从入门到深化)

目录 SpringMVC文件上传_原生方式上传 SpringMVC文件上传_SpringMVC方式上传 SpringMVC文件上传_上传多文件 SpringMVC文件上传_异步上传 SpringMVC文件上传_跨服务器上传 SpringMVC文件上传_原生方式上传 上传是Web工程中很常见的功能&#xff0c;SpringMVC框架简化了文…

17、SQL注入之二次、加解密、DNS等注入

目录 加解密二次注入DNSlog注入涉及资源:中转注入 加解密 %3D是等号 值在带入数据库之前是有一个解码的操作&#xff0c;明文在解码的时候&#xff0c;就会出现问题&#xff0c;进而影响到语句&#xff1b;密文和明文在一起&#xff0c;这种网站后台是识别不了的&#xff1b;只…

P1332 血色先锋队

血色先锋队 题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&…

银行家算法C语言代码

/*the code simulate blank algorithm to void deadlock*/ /*author:RongGong*/#include<stdio.h> #define MAX_RES_PROC 100//定义银行家算法的数据结构 int M; // 资源的个数 int N; // 进程的个数 int Available[MAX_RES_PROC] {0}; //可利用资源向量 int MaxNeed[MA…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…