【Linux】网络基础2

news2025/2/12 12:22:18

文章目录

  • 网络基础2
    • 1. 应用层
      • 1.1 协议
      • 1.2 HTTP 协议
        • 1.2.1 URL
        • 1.2.2 urlencode和urldecode
        • 1.2.3 HTTP协议格式
        • 1.2.4 HTTP的方法
        • 1.2.5 HTTP的状态码
        • 1.2.6 HTTP 常见的header
        • 1.2.7 最简单的HTTP服务器
    • 2. 传输层
      • 2.1 端口号
        • 2.1.1 端口号范围划分
        • 2.1.2 认识知名端口号
        • 2.1.3 netstat
        • 2.1.4 pidof
    • 3. UDP 协议
      • 3.1 UDP协议格式
      • 3.2 UDP的特点
      • 3.3 基于UDP的应用层协议
    • 4. TCP协议
      • 4.1 TCP协议段格式
      • 4.2 确认应答ACK机制
      • 4.3 超时重传机制
      • 4.4 连接管理机制
      • 4.5 滑动窗口
      • 4.6 流量控制
      • 4.7 拥塞控制
      • 4.8 延迟应答
      • 4.9 捎带应答
      • 4.10 面向字节流
      • 4.11 粘包问题
      • 4.12 TCP异常情况
      • 4.13 TCP小结

网络基础2

1. 应用层

满足日常需求的应用程序都是在应用层

1.1 协议

协议是一种约定。socket api在读写程序的时候都是按照字符串的方式发送的,如果传输一些结构化数据该怎么办?

只要保证一端发送数据的时候,在另一端能够正确的解析。这就是应用层协议

1.2 HTTP 协议

HTTP协议(超文本传输协议)

1.2.1 URL

平时俗称的“网址”就是URL
w4kley9xud-1691718642986.png

1.2.2 urlencode和urldecode

像这样的字符串已经被URL当做特殊意义理解了,因此不能随意出现在URL当中
某个参数需要带特殊字符,就必须先对这些特殊字符进行转义
转义规则如下:
将需要转义的字符转为16进制,然后从右到左,取4位(不足4位直接处理)。每两位做一位,前面加上%

1.2.3 HTTP协议格式

HTTP请求:
px8020wnap-1691719356122.png

  • 首行:请求方法 URL 版本
  • Header:请求的属性,冒号分割的键值对,每组属性之间使用\n分割,遇到空行表示header部分结束
  • Body:空行后面的内容都是body,允许为空字符串如果body存在,则在头部中有一个Content -Length来标识Body的长度
    HTTP响应:
    nj8yujtmkb-1691719589985.png
  • 首行:版本号 状态码 状态码解释
  • Header:请求的属性,冒号分割的键值对,每组属性之间使用\n分割,遇到空行表示header部分结束
  • Body:空行后面的内容都是body,如果body返回一个html页面,那么页面内容就是在body当中

1.2.4 HTTP的方法

ebpiu207yn-1691719762109.png
其中最常用的就是GET和POST方法

1.2.5 HTTP的状态码

ysoq24t5y6-1691719928993.png

403状态码表示服务器理解请求,但拒绝执行请求。这通常是因为请求的资源对用户是禁止访问的,例如需要身份验证的页面或没有访问权限的页面。403状态码与401状态码的区别在于,401状态码表示未经身份验证的用户,而403状态码表示已经身份验证的用户,但没有访问权限。
302状态码表示重定向。当服务器收到客户端的请求后,会返回302状态码和一个Location头部,指示客户端重定向到另一个URL。这通常用于临时性的重定向,例如当一个网页被移到了新的URL上时,服务器可以返回302状态码和新的URL,以便客户端自动跳转到新的URL。
303状态码表示重定向,与302状态码类似。它通常用于POST请求后的重定向,以防止客户端重复提交表单数据。当服务器收到POST请求后,如果希望客户端重定向到另一个URL来获取结果,服务器会返回303状态码和一个Location头部,指示客户端进行GET请求以获取结果。这样可以防止客户端在刷新页面时重新提交表单数据。

1.2.6 HTTP 常见的header

  • Content-Type, 数据类型
  • Content-Length, Body的长度
  • Host,客户端告知服务器所请求的资源是在那个主机的那个端口上
  • User-Agent:声明用户的操作系统和浏览器的版本信息
  • referer: 当前页面是从那个页面跳转过来的
  • location:搭配3XX 状态码,告诉客户端接下来去哪里访问
  • Cookie, 用于在客户端存储少量信息,通常实现会话的功能

1.2.7 最简单的HTTP服务器

实现一个最简单的服务器,返回客户端一个hello world

#include <iostream>
#include <cstring>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        std::cout << "输入参数过少" << std::endl;
        return 0;
    }
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in local;
    memset(&local, 0, sizeof(local));
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = inet_addr(argv[1]);
    local.sin_port = htons(atoi(argv[2]));
    bind(sock, (struct sockaddr*)&local, sizeof(local));
    listen(sock, 32);
    while (true)
    {
        struct sockaddr_in client;
        memset(&client, 0, sizeof(client));
        socklen_t len = sizeof(client);
        int n = accept(sock, (struct sockaddr*)&client, &len);
        if (n < 0) continue;
        char buf[1024];
        const char* hello = "<h1>hello world</h1>";
        sprintf(buf, "HTTP/1.0 200 Ok\nContent-Length:%lu\n\n%s", strlen(hello), hello);
        write(n, buf, sizeof(buf));
    }
    return 0;
}

2. 传输层

负责把数据从发送端传输到接收端

2.1 端口号

端口号标识了主机进行通信的不同的应用程序
lj8va87f1a-1691728050114.png
u05paqg9k2-1691729004985.png

2.1.1 端口号范围划分

  • 0-1023 知名端口号,HTTP、FTP、SSH广为使用的应用层协议,端口号都是固定的
  • 1024-65535:操作系统动态分派的端口号,客户端程序的端口号

2.1.2 认识知名端口号

  • ssh服务,使用22端口号
  • ftp服务,使用21端口号
  • telnet服务,使用23端口号
  • http服务:使用80端口号
  • https服务:使用443端口号

cat /etc/services

一个进程可以绑定多个端口号,但是一个端口号不能绑定多个进程

2.1.3 netstat

netstat是用来查看网络状态的重要工具

  • n 显示别名,能显示数字的全部转化为数字
  • l 仅列出在listen状态的
  • p 显示建立相关链接的程序名
  • t 仅显示TCP相关的
  • u 显示udp相关的
  • a 显示所有选项默认不显示Listen

2.1.4 pidof

查看服务器的进程id

3. UDP 协议

3.1 UDP协议格式

yab1ae8gh2-1691730775984.png

  • 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度
  • 如果校验和出错,就会直接丢弃

3.2 UDP的特点

udp传输的过程类似于寄信:

  • 无连接:知道对方的IP和端口进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制;如果因为网络无法发送给对方,UDP也不会给应用层任何错误信息
  • 面向数据报:不够灵活的控制读写数据的次数和数量

面向数据报
应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并
用udp传输100个字节的数据:

如果发送端一次调用sendto,发送100个字节,那么接收端必须调用一次对应的recvfrom,接收100个字节,不能循环的调用10次recvfrom ,每次接收10个字节

UDP的缓冲区
Udp没有真正意义上的发送缓冲区,调用函数之后直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。UDP如果接收缓冲区满了之后,再达到的UDP数据就会被丢弃

UDP的socket既能读也能写,这个概念就叫做全双工

3.3 基于UDP的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • DNS:域名解析协议

4. TCP协议

TCP全称为“传输控制协议”,要对数据的传输进行一个详细的控制

4.1 TCP协议段格式

6gxb36fzji-1691734533996.png

  • 4位TCP报头长度:表示TCP报头有多少个32位bit (有多少个4字节),所以TCP头部最大长度是60字节 15 * 4

  • 6 为标志位:

    • URG:紧急指针是否有效
    • ACK:确认号是否有效
    • PSH:提示接收端应用程序立刻从TCP接收缓冲区读走数据
    • RST:对方要求重新建立连接,把携带RST标识称为复位报文段
    • SYN:建立请求连接,携带SYN标识的称为同步报文
    • FIN:通知对方,本端要关闭了,携带FIN标识的称为结束报文段
  • 16位校验和:发送端填充,CRC校验,接收端校验不通过,则认为数据有问题,这个不光包含TCP首部也包含TCP数据部分

  • 16位紧急指针:标识那部分数据是紧急数据

4.2 确认应答ACK机制

o6yacm7k22-1691735577987.png
TCP将每个字节的数据都进了编号,称为序列号:
nb5oi5b6p3-1691735648989.png
每一个ACK都带有对应的确认序号列,意思是告诉发送者,收到了哪些数据,下一次从哪里开始发送

4.3 超时重传机制

78evruvp7f-1691736492112.png
如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会重新发送
但是,主机A未收到主机B的确认应答,可能是因为ACK丢失了
msabh15u5h-1691736613986.png
因为主机B会收到很多重复数据,那么TCP协议需要识别哪些包是重复的包,并且把重复的包丢弃掉。这时候可以利用前面提到的序列号,就可以很容易做到去重的效果

超时时间如果确定?

找到一个最小的时间,保证“确认应答一定能在这个时间内返回”,但是这个事件段的长短,随着网络环境的不同也是有差异的。如果设置的时间太长,会影响整体的重传效率,如果设置的时间太短,有可能频繁发送重复的包

TCP为了保证无论在任何环境下都比较高性能的通信,因此会动态的计算这个时间

  • 超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍
  • 如果等待一次后,仍然得不到应答,等待2 * 500 ms在重传
  • 如果仍然得不到应答,以指数形式递增
  • 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,就会关闭连接

4.4 连接管理机制

在正常情况下,TCP要经过三次握手建立连接和四次挥手断开连接
aljwoq2uwc-1691737208110.png

4.5 滑动窗口

对每个发送的数据段,都要给一个ACK应答。收到ACK后再发送下一个数据段,这样做的一个比较大的缺点是,性能比较差尤其是数据段返回需要的时间比较长
8b6zxxfu4j-1691737792114.png
既然这样一发一收的性能比较低,我们可以一次性发送多条数据,就可以大大提高性能(其实是将多个段的等待时间重叠在一起)
9cjfoivwl4-1691737874113.png
操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录哪些数据没有应答,只有确认应答的数据,才能从缓冲区删掉
窗口越大,则网络的吞吐率越高
j6mh9pbphf-1691738036987.png
如果出现了丢包,如何重传?
这样需要分情况考虑:
情况一:数据报到了,但是ACK丢了
24z8uzf8zh-1691738198993.png
这种情况下,部分ACK丢了不要紧,可以通过后续的ACK进行确认
情况二:数据报丢了
9q3kkynnqm-1691738251109.png
如果发送端主机连续三次收到同样的ACK应答,就会将对应的数据重新发送。
被收到接收端操作系统的接收缓冲区内
这种机制被称为“高速重发控制”(也叫快重传

4.6 流量控制

接收端处理数据的速度是有限的,如果发送端发送的太快。导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包继而引起丢包重传一系列连锁反应

TCP 支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫做流量控制

  • 接收端将自己可以接收的缓冲区大小放入TCP首部的“窗口大小”字段,通过ACK通知发送端
  • 窗口大小字段越大,说明网络的吞吐量越高
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口设置成一个更小的值通知发送端
  • 发送端接收到这个窗口的大小之后,就会控制自己的发送速度
  • 如果接收方缓冲区满了,就会将窗口设置为0,这是发送方不在发送数据,但是定期发送窗口探测数据段,是接收端窗口大小告诉发送端
    ywydehaq07-1691738825114.png

4.7 拥塞控制

虽然TCP有了滑动窗口,可以高效发送大量的数据,但是在刚开始时就发送大量的数据可能引发问题
网络上可能有很多计算机,可能当前的网络状态就已经比较拥堵,在不清楚网络状态的情况下,贸然发送大量数据可能雪上加霜

TCP引入慢启动机制,先发少量的数据探探路,摸清当前网络的拥堵情况,在确定按照多大的速度传输数据
qsecpy5jzz-1691739364106.png
发送开始的时候定义拥塞窗口大小为1, 每次收到一个ACK应答拥塞窗口加1。每次发送数据报的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为直接发送的窗口

这个地方有个慢启动的阈值,当拥塞窗口超过这个阈值的时候,不在按照指数方式增长,而是线性方式增长
f1dzy9eise-1691739610104.png

4.8 延迟应答

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。如果接收端稍微等一会在应答,返回的窗口可能就很大
窗口越大,网络吞吐量就越高,目标是在保证网络不拥塞的情况下,尽量提高传输效率
每个包都延迟应答吗?

  • 数量限制:每隔N个就应答一次
  • 时间限制:超过最大延迟时间就应答一次
    ktxryryfzd-1691739979110.png

4.9 捎带应答

在延迟应答的基础上,我们发现很多情况下,客户端服务器在应用层也是“一发一收”的意味着客户端给服务器发送了一条消息,服务端也会返回一个消息。这个是会后ACK就可以搭顺丰车,和服务器返回的消息一起返回给客户端
ni9f7hfwj3-1691750195994.png

4.10 面向字节流

创建一个TCP的socket,同时在内核中创建一个接收缓冲区发送缓冲区

  • 调用write时,数据会先被写入发送缓冲区当中,如果发送的字节流太长会被拆分成多个TCP报文发出;如果发送的字节数太短就会在缓冲区里等待,等待缓冲区长度差不多了或者合适的时机发出去
  • 接收数据的时候,数据也是从网卡驱动到达内核接收缓冲区。然后调用read可以从缓冲区里读取数据
  • TCP的一个连接,既有发送缓冲区也有接收缓冲区,对于这一个连接,即可以读数据也可以发送数据这就是全双工

4.11 粘包问题

这里的“包”指的是应用层的数据报
在TCP协议头中,没有UDP一样的“报文长度”,但是有一个序号这样的字段。站在传输层的角度,TCP是一个报文一个报文发送过来的。按照序号排好放在缓冲区。站在应用层的角度看到的是一连串的数字应用程序看到这一连串的字节数据,就不知道那个部分开始啊到那个部分,是一个完整的数据报
如何解决粘包问题?
明确两个包之间的边界

4.12 TCP异常情况

进程终止:进程终止会释放文件描述符,仍然可以发送FIN。和正常关闭没什么区别
一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset。即使没有写入操作,TCP也会内置一个保活定时器,会定期询问对方还在不在,也会连接释放

4.13 TCP小结

可靠性:

  • 校验和
  • 序列号(按序到达)
  • 确认应答
  • 超时重发
  • 连接管理
  • 流量控制
  • 拥塞控制

提高性能:

  • 滑动窗口
  • 快速重传
  • 延迟应答
  • 捎带应答

listen的第二个参数,是为了保证系统资源不浪费

TCP连接管理使用两个队列:

  1. 半链接队列
  2. 全连接队列
    全连接队列的长度会受到listen的第二个参数的影响。这个队列的长度是listen的第二个参数+1

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

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

相关文章

RFID技术应用于服饰市场

RFID技术应用于服饰市场 RFID技术已广泛应用于服饰制造加工行业&#xff0c;为企业提供了许多实用的解决方案。下面是一些常见的应用场景&#xff1a; 库存管理&#xff1a;RFID标签可以被缝制或附着在服装上&#xff0c;通过RFID读写器进行扫描。企业可以实时跟踪和管理库存…

配置中心替换测试设计分享

一、背景 项目后端服务开始一直使用Apollo配置中心(携程开发)进行配置管理&#xff0c;由于公司自研了配置中心B&#xff0c;为了后续方便管理和降本增效&#xff0c;后端服务使用的配置需要由Apollo配置中心切换到自研配置中心B。后续不再使用Apollo配置。 替换前架构&#x…

Photoshop神器插件Alpaca安装与使用指南

Alpaca是一款Photoshop的插件,它可以自动生成各种图片,大大提高我们的工作效率。今天就为大家介绍如何安装和使用Alpaca这个好用的插件。 一、下载并安装Alpaca 在Chrome浏览器中打开Alpaca的官网,点击join alpaca beta 注册帐号。 下载完成后,解压安装包,运行里面的Alpaca …

米尔核心板纯国产入门级性价比优选T113

近些年&#xff0c;国产MPU弯道超车越来越给力&#xff0c;芯片国产化&#xff0c;不再纯依赖进口&#xff0c;产品平台选型自主可控&#xff0c;未来国产化的主芯片平台产品将进一步蓬勃发展。为满足客户对入门级、低成本、高性能的国产需求&#xff0c;米尔电子推出国产入门级…

28 | Boss直聘数据分析

针对boss直聘网的招聘信息,然后分析互联网发展排名前十的城市在互联网方面职位的薪水,学历要求,经验要求,等等信息。 准备从以下几个方面进行分析: (1)各个城市的平均工资 (2)各个学历的平均工资 (3)各个岗位的平均工资 (4)不同工作经验要求的工资 (5)各个经验…

通讯录(静态版)

通讯录&#xff08;静态版&#xff09; 通讯录无非就是实现以下功能&#xff1a; 1.前言 首先要知道一个人要包含哪些信息&#xff0c;这里就以&#xff08;姓名&#xff0c;年龄&#xff0c;性别&#xff0c;电话号码&#xff0c;地址&#xff09;为例&#xff0c;这些信息…

ssh-keygen 做好免密登录后不生效

免密说明 通常情况下&#xff0c;我们ssh到其他服务器需要知道服务器的用户名和密码。对于需要经常登录的服务器每次都输入密码比较麻烦&#xff0c;因此我们可以在两台服务器上做免密登录&#xff0c;即在A服务器可以免密登录B服务器。 在A服务器上登录B服务器时&#xff0c;…

29 | 广州美食店铺数据分析

广州美食店铺数据分析 一、数据分析项目MVP加/价值主张宣言 随着经济的快速发展以及新媒体的兴起,美食攻略、美食探店等一系列东西进入大众的眼球,而人们也会在各大平台中查找美食推荐,因此本项目做的美食店铺数据分析也是带有可行性的。首先通过对广东省的各市美食店铺数量…

Qt扫盲-Qt Model/View 理论总结 [上篇]

Qt Model/View 理论总结 [上篇] 一、概述1.model / view 架构2. Model3. View4. Delegate5. 排序6. 快捷类 二、使用model/view1. Qt包含两种 model2. 在现有 model 中使用 view 三、Model 类1. 基本概念1.model 索引2. 行和列2. item 的父 item3. Item roles4. 总结 2. 使用mo…

小程序生成App:轻量低门槛的开发方式

小程序生成App可以成为一种轻量低门槛的开发App的方式&#xff0c;但是需要根据具体情况进行选择。如果应用需要处理大量数据或需要进行复杂计算&#xff0c;或者需要实现原生特有的功能或交互效果&#xff0c;可能需要选择其他开发方式。 在文章开始之前&#xff0c;我们看看目…

优维产品最佳实践第4期:如何在海量日志中捞到你要的关键字?

优维产品最佳实践第4期&#xff1a;如何在海量日志中“捞“到你要的关键字&#xff1f; 日志记录了软件系统的生命线&#xff0c;为我们提供了故障排查和性能优化的关键线索。 本期EasyOps产品使用最佳实践&#xff0c;我们将为您揭晓&#xff1a; 如何监控日志的关键字&#x…

c51单片机串口通信(中断方式接收数据)(单片机--单片机通信)示例代码 附proteus图

单片机一般采用中断方式接受数据&#xff0c;这样便于及时处理 #include "reg51.h" #include "myheader.h" #define uchar unsigned char int szc[10]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int bufferc[6]{0}; int sza[6]{0x01,0x02,0x0…

【论文阅读】基于深度学习的时序预测——LSFT-Linear

系列文章链接 论文一&#xff1a;2020 Informer&#xff1a;长时序数据预测 论文二&#xff1a;2021 Autoformer&#xff1a;长序列数据预测 论文三&#xff1a;2022 FEDformer&#xff1a;长序列数据预测 论文四&#xff1a;2022 Non-Stationary Transformers&#xff1a;非平…

allegro中不可选时,如何对find进行可选操作

allegro出现不可选时&#xff0c;只能尝试其他单一的操作&#xff0c;但这样效率不高&#xff1b;可以通过菜单栏Display下拉菜单点击Element&#xff0c;即可实现FIND下选择需要调整的选项。

【PCL】激光雷达常用传统感知算法学习

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍常用激光感知算法学习。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

VR家装提升用户信任度,线上体验家装空间感

近些年&#xff0c;VR家装逐渐被各大装修公司引入&#xff0c;VR全景装修的盛行&#xff0c;大大增加了客户“所见即所得”的沉浸式体验感&#xff0c;不再是传统二维平面的看房模式&#xff0c;而是让客户通过视觉、听觉、交互等功能更加真实的体验家装后的效果。 对于传统家装…

Blazor 简单组件(1):B_Icon开发

文章目录 前言ICON开发使用 前言 Blazor 简单组件(0)&#xff1a;简单介绍 ICON开发 <i class"Type" style"font-size:(Size)px;color:Color;"></i>code {/// <summary>/// icon类型/// </summary>[Parameter]public string Typ…

基于rsesnet网络架构的图像分类模型

数据预处理部分&#xff1a; 数据增强&#xff1a;torchvision中transforms模块自带功能&#xff0c;比较实用数据预处理&#xff1a;torchvision中transforms也帮我们实现好了&#xff0c;直接调用即可DataLoader模块直接读取batch数据 网络模块设置&#xff1a; 加载预训练…

哨兵2号在SNAP中去云处理

1.Fmask软件对1C级产品进行处理&#xff0c;识别像素类别 不知道Fmask是什么可以先去百度一下 软件下载,链接到github地址 我下载的是4.5版本&#xff0c;无脑安装即可。 双击打开软件&#xff08;需要等一会&#xff09;&#xff0c;长这样 路径选择E:\S2\S2A_MSIL1C_20220…

【uniapp】滚动相关

1、滚动到一定区域&#xff0c;顶部内容置换并置顶 功能&#xff1a; 当我向下滚动时&#xff0c;当关注那一行快到顶部的时候&#xff0c;把左侧区域的内容切换成右侧区域的内容&#xff0c;并置顶 原先我使用v-if来显示隐藏&#xff0c;发现会出现闪屏的现象&#xff0c;后来…