linux网络-----传输层

news2024/9/21 22:29:59


前言


一.传输层:

数据要交接应用层先通过传输层(给哪个程序发数据)

传输层作用:负责数据能够从发送端传输接收端。对于应用层来说有许多服务,传输层怎么知道把数据发给那个应用服务?

这时就有了端口号:端口号(Port)标识了一个主机上进行通信的不同的应用程序。在服务器和多个客户端通信时,它怎么识别的哪个客户端哪个通信呢?通过五元组,即使端口号相同也可以通过

ip地址区分。可以简单理解为一个ip地址标识唯一个主机,而端口号标识一个主机上的唯一个进程

不过端口号也是不可以随便绑定的,有些服务端口号就是固定:

0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的
1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.那么问题来了?

那一个进程可以绑定多个端口号吗?这是可以的

一个端口号可以绑定多个进程吗,不可以。这样的话,传输层就识别不了应用层哪个进程了。
 

(1)网络命令: 

查看:netstat -n

简单介绍一下查看网络命令:sudo netstat -ntpl

选项:

------t  查看tcp协议的

-------u查看udp协议的。

-----n表示可以显示数字的显示数字

-----l表示处在监听状态的,不带l表示查看不处于监听状态的

-----a如显示监听和非监听状态的

------p是查看服务名称的(PID/program)

如何方便查看进程id?

pidof+进程名:方便查看进程的id

(3)UDP协议

格式:

一个dup数据报形成,可以简单理解为,我们在应用层发送的数据会被拷贝到内核的缓存区,封装报头,就是一个完整的数据报了。但是对于一个服务器来说或者客户端,会大量收到数据报还没来的及处理堆积在内核的缓冲区,就要对它进行管理(转化为对链表的增删查改)

udp特点:

需要注意的是udp长度是16位,所以发送一个数据包不可以超过64k的大小。除非处理后小于64k 

(3)Tcp协议

(1)tcp的确认应答机制:

在经过2次发送和2次应答,双方确认了连接的可靠性,发送一次,应答一次,但是这种发方式是串行,为了保证效率。采用了发送时间重叠(同时发送),这是最常见的发送

                

但是对于这个也会有问题,由于发送经过网络,会造成接收方的顺序不一致。tcp根据报头32位确认序号,进行排序。保证接收和发送的顺序是一致的。

捎带应答:在客户端向服务器发送消息时,由于tcp是全双工,服务器收到消息进行应答时也会携带自己的消息进行发送,所以32位序号和32位确认序号会被同时使用。

32位序号:为保证数据的有序性,对报头进行排序。

32位确认序号:发送方确认历史数据的到达。

16位窗口大小,告知对方接收缓冲区的大小,进行流量控制。

所以tcp保证可靠性的同时,也提高了效率。

六位标记位:实际是区分报文的类型,发送什么类型的报文,该做什么动作。

URG和16位紧急指针是对应的,如果urg被置1, 紧急指针就会被设置。

RST:链接建立认知不一致,在第三次握手时,可能会失败,因为最后一次握手没有ack.如果最后一次报文丢失,客户端因为链接建立好了,而服务端没收到报文,认为没建立好链接。这时客户端向服务器发送消息,服务器就会向客户端发送RST的报文,让客户端重新链接。

二.超时重传机制

主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发

但是, 主机A未收到B发来的确认应答, 也可能是因为ACK丢失了。这时主机A就会重发,不过主机B就会收到两个一样的报文,它就会根据32位序号进行去重。

 

那么重传的时间是如何控制的:Linux中超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍. 

(1)连接管理机制

tcp连接要经过3次握手和四次挥手。

3次握手(实际是四次握手,其中一次是捎带应答):以最小的成本验证全双工同时保证客户端链接建立成功然后服务端建立连接。

四次挥手:告诉双方不再发送消息。

可以通过系统调用关闭套接字读或者写。

(2)连接状态

对于连接状态,操作系统会在内存中维护一个网络连接的结构体。如果客户端先断开连接,服务端就会先处于close_waite状态,然后客户端收到应答处于fin_waite2。那如果服务端没有close.双方一直处于这两种状态,就是都没有挥手成功,结构体中的状态不处于close.占用大量资源(内存)

这里注意的是主动断开连接的一方会有time_waite状态。

为什么是TIME_WAIT的时间是2MSL?

MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL的话 就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到 来自上一个进程的迟到的数据, 但是这种数据很可能是错误的); 同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这 时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)。

二、滑动窗口

在前面说过tcp采用时间重叠发送大量的报文,而滑动窗口的里的就是这等待发送的报文而不需要ACK的数据段。怎么理解呢,客户端需要发送数据就要把数据拷贝到发送缓冲区。我们可以把缓冲区理解为一个字符数组,而滑动窗口是缓冲区的一段区域。

滑动窗口是如何工作的:

滑动窗口的变大,变小,0.

如果发送方发送大量报文,而接收方的缓存区的数据还没有被上层取走。然后接收方返回ack的确认序号,statr++,而end不动(因为缓存区的数据没有被上层读走)直到end和statr指向同一个位置,滑动窗口就为0了。如果缓存区数据被读走了,有空间。返回的ack报文的窗口大小win+原来的statr,窗口就变大了。所以接收方接收能力可以控制发送方发送的数据量,来实现流量控制。

(1)丢包问题:

当某一段报文段丢失之后, 发送端会一直收到 1001 这样的ACK, 就像是在提醒发送端 "我想要的是 1001" 一样; 如果发送端主机连续三次收到了同样一个 "1001" 这样的应答, 就会将对应的数据 1001 - 2000 重新发送; 这个时候接收端收到了 1001 之后, 再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已 经收到了, 被放到了接收端操作系统内核的接收缓冲区中; 这种机制被称为 "高速重发控制"(也叫 "快重传"). 

(2) 拥塞控制

场景1:如果网络不好,发送方发送大量的报文,而接收方没有接收到,到了一定时间就会超时重传,而一个服务器连接了很多个客户端,大家都因为网络问题发送超时重传,这是不合理的。

拥塞控制就是针对网络问题,对网络状态进行探测,网络通畅,发送的数据就多,不通畅就少。

开始网络探测时,会发送一个报文。如果收到应答,就会增长发送报文数量。当然也受对方接收能力的限制,一般滑动窗口规定为拥塞窗口和对方接收窗口的最小值。

(3)拥塞窗口增长算法:

(4)延迟应答

在接收方收到报文时,并不会立即ack.为了保证传输的效率,会等待一定的实际,等上层应用把缓存区的数据读走,这样返回的窗口大小尽可能的大。

(5)粘包问题

不同与udp,它的报文长度是固定的,本身就可以解决数据和数据之间的边界,问题。你发送多少他就接收多少。而tcp不同,多次写入的数据可能在内核缓冲区中,可能一次发送,数据是连续的,所以要解决粘包问题。

解决粘包问题的方法:

(1)特殊字符

(2)定长报文

(3)报头+自描述字段(http)

  (6)listen的第二个参数

在操作系统中会维护两个队列:

1. 半链接队列(用来保存处于SYN_SENT和SYN_RECV状态的请求)

2. 全连接队列(accpetd队列)(用来保存处于established状态,但是应用层没有调用accept取走的请求)。

应用层accept不参与3次握手,建立连接是操作系统帮我们完成的,但是如果我们上层没有调用accep请求,就会维护两个队列,一个是已经建立连接处于established状态的,还有一个是尝试建立连接但是服务器不会跟它进行3次握手。全连接会维持一段时间,而半连接一会就消失了。

listen的第二个参数就是设置全连接队列节点的个数(每个节点就是一个以及建立好连接),如果请求的连接超出这个个数,会被维护到半链接队列中。

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

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

相关文章

BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?

1.说明 1.1 背景 无意中看到PCA9545(switch芯片)后面有设备,但是PCA9545设备本身是连接到物理设备i2c上的,然而扫描该物理i2c bus,却找不到该设备。此篇文章主要找一下该原因的。 1.2 参考代码 当前使用的是ast2600芯片,可参考…

Mudslide

作者未提供代码

Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)

发布版本链接 通过百度网盘分享的文件:TCP调试助手V1.zip(含客户端与服务器) 链接:https://pan.baidu.com/s/14LTRPChPhYdwp_s6KeyBiA?pwdcedu 提取码:cedu 基于Qt/C实现了一款功能丰富的TCP服务器与客户端调试助手…

HT876 带任意限幅的10.9Wx2高保真音频功放

特点 可任意配置的限幅功能 自由选择音频限制幅度,使输出音频信号限制在固定 失真水平内 内置自动限温控制功能 支持AB类与D类切换 THDN:0.02%(VDD8.4V, RL 4Ω, fIN 1kHz, Po 2x1.0W, BTL) 输出功率(fIN1kHZ,THDN10%) 2x10.9W (VDD9.0V, RL4Ω, BTL) VDD供电范围:2…

【C++】模拟实现二叉搜索(排序)树

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 📌实现BSTreeNode类模板 🎏构造BSTreeNode类成员变量 🎏实现BSTreeNode类构…

空间解析几何2:空间中两线段/直线的距离【附MATLAB代码】

目录 理论公式 MATLAB代码 理论公式 MATLAB代码 公式实现 function [dis,P,Q,t1,s1]line2LineDistance(A1,B1,C1,D1) %求两线段的最短距离 % input % A1,B1为线段一的两端点 C1,D1为线段二的两端点 % output % dis,为两线段的最短距离,P,Q为距离最短时在两线段上…

10.2 溪降技术:双重检查

目录 10.2 双重检查概览观看视频课程电子书:双重检查场景场景 1场景 2 个人责任示例 1示例 2 总结 10.2 双重检查 概览 俗话说:“江山易改,本性难移”。在我们开始体验峡谷探险时,培养良好的习惯对我们的进一步发展至关重要。在所…

Spring AOP的应用

目录 1、maven坐标配置与xml头配置 2、代理方式的选择与配置 3、AOP的三种配置方式 3.1、XML模式 3.1.1 创建目标类和方法 3.1.2 创建切面 3.1.3 切面xml配置与表达式说明 3.1.4 单测 3.2 纯注解模式 3.2.1 开启注解相关配置 3.2.2 创建目标类和方法 3.2.3 创建切面…

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…

java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能,该如何去实现呢? 1.创建牌类:52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card):包含大小和花色。 public class Card { //单张牌的大小及类型/…

20240921在友善之臂的NanoPC-T6开发板上使用Rockchip原厂的Android12适配宸芯的数传模块CX6602N

127|console:/ # uname -a console:/ # ifconfig console:/ # ifconfig -a console:/ # ifconfig -a 130|console:/ # ifconfig usb0 192.168.42.130 console:/ # console:/ # ifconfig console:/ # iperf3 -s & iperf3 -c 192.168.42.130 -i 1 -t 30 20240921在友善之臂的…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署Grav内容管理系统

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署Grav内容管理系统 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Grav介绍2.1 CMS介绍2.2 Grav简介2.3 Grav特点2.4 …

TinyML-On-The-Fly: 实时、低功耗、低成本的微控制器嵌入式设备内计算机视觉技术用于无人机图像分类

这篇论文的标题是《TinyML-On-The-Fly: Real-Time Low-Power and Low-Cost MCU-Embedded On-Device Computer Vision for Aerial Image Classification》,作者是 Riya Samanta, Bidyut Saha, Soumya K. Ghosh,来自印度理工学院克勒格布尔分校。论文主要研…

电子元器件之MOS管,附上几个常用MOS管电路和仿真。

MOS管是一种常用的电子元器件。 1.MOS管的类别 MOSFET简称MOS,是一种绝缘栅型场效应管。按照类别可以分为增强型mos管和耗尽型mos管。 导电沟道的形成方式‌ 增强型MOS管:在没有外加电压时,源极和漏极之间没有导电沟道存在。只有当栅极电…

【玉米田】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long LL;const int mod 1e8; const int M 1 << 12; LL f[13][M]; int g[13]; vector<int> state; vector<int> p[M]; int n, m; bool check(int x) {return !(x & x <&…

攻防世界---->Windows_Reverse1(补)

做题笔记。 做题回顾。 假设&#xff0c;我们不知道地址随机怎么办&#xff1f;不能动调&#xff0c;只能静态分析。 下载 查壳 upx脱壳。 32ida打开。 动调报错。 重新打开&#xff0c;静态分析。 跟进关键函数。 不明白可以反汇编和汇编一起看。 溯源。 *decode 取值等于 by…

分布式锁之 防误删(优化之UUID防误删)

文章目录 1、AlbumInfoApiController --》testLock()2、AlbumInfoServiceImpl --》testLock()3、问题&#xff1a;删除操作缺乏原子性。 实现如下&#xff1a; 1、AlbumInfoApiController --》testLock() Tag(name "专辑管理") RestController RequestMapping(&quo…

【计网】从零开始掌握序列化与反序列化 --- 基础知识储备与程序重构

从零开始掌握序列化与反序列化 1 初识序列化与反序列化2 再谈Tcp协议3 程序重构3.1 Socket类3.2 回调函数设计3.3 最终的Tcp服务器类 1 初识序列化与反序列化 在刚学习计算机网络时&#xff0c;我们谈到过网络协议栈&#xff0c;其中最上层的就是应用层&#xff0c;那么这个应…

Qt圆角窗口

Qt圆角窗口 问题&#xff1a;自己重写了一个窗口&#xff0c;发现用qss设置圆角了&#xff0c;但是都不生效&#xff0c;不过子窗口圆角都生效了。 无边框移动窗口 bool eventFilter(QObject *watched, QEvent *evt) {static QPoint mousePoint;static bool mousePressed f…

开源、极简的B站第三方,建议所有人收藏

很多人说B站落寞了&#xff0c;但我觉得不是B站落寞&#xff0c;而是长视频落寞了。现代人已经没有充足的耐心&#xff0c;刷完一个十分钟的视频。毕竟&#xff0c;短视频可以把这十分钟切成50份&#xff0c;让我们开心50次。 可怕的是&#xff0c;B站即使落寞&#xff0c;在长…