Linux 38 网络协议:从独立主机到全球互通

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

🌟心向往之行必能至

目录

一.初识协议

二.协议分层

[2.1 软件分层的好处](#2.1 软件分层的好处)

[2.2 OSI七层模型](#2.2 OSI七层模型)

[2.3 TCP/IP五层(或四层)模型](#2.3 TCP/IP五层(或四层)模型)

三.再识协议

3.1什么是TCP/IP协议?

四.网络传输的基本流程

[4.1局域⽹ 络传输流程图](#4.1局域⽹ 络传输流程图)

[4.2 协议封装和解包](#4.2 协议封装和解包)

[4.3 跨⽹络传输流程图 :- 认识IP地址](#4.3 跨⽹络传输流程图 :- 认识IP地址)

五.socket编程预备

[5.1 认识端口号](#5.1 认识端口号)

[5.2理解 "端⼝号" 和 "进程ID" 解耦](#5.2理解 "端⼝号" 和 "进程ID" 解耦)

5.3理解源端⼝号和⽬的端⼝号

[5.4 传输层的典型代表](#5.4 传输层的典型代表)

5.4.1认识TCP协议

5.4.2认识UDP协议

[5.5 网络字节序](#5.5 网络字节序)

[六.socket 接口](#六.socket 接口)


早期计算机是互相独立的,后来科学家为了工作效率,将多台计算机连在一起,完成了数据共享,再到后来全球互通,就到了整体

一.初识协议

• "协议" 是⼀种约定.
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表⽰ 0 和 1 这样的信息. 要想传递各
种不同的信息, 就需要约定好双⽅的数据格式.
思考: 只要通信的两台主机, 约定好协议就可以了么?
• 定好协议,但是你⽤频率表⽰01,我⽤强弱表⽰01,就好⽐我⽤中国话,你⽤葡萄⽛语⼀样,虽
然⼤家可能遵守的⼀套通信规则,但是语⾔不同,即是订好了基本的协议,也是⽆法正常通信的
所以,完善的协议,需要更多更细致的规定,并让参与的⼈都要遵守。
• 计算机⽣产⼚商有很多;
• 计算机操作系统, 也有很多;
• 计算机⽹络硬件设备, 还是有很多;
• 如何让这些不同⼚商之间⽣产的计算机能够相互顺畅的通信? 就需要有⼈站出来, 约定⼀个共同的
标准, ⼤家都来遵守, 这就是 ⽹络协议;

常见的局域网通信的标准
以态网
令牌环网
无线LAN

上面的以太网进行交流时,

任何时刻都只允许一台机器向网络发送数据(互斥,所以以太网就是共享资源)

如果有多台同时发送,就会发生数据干扰,称之为数据碰撞(人多的时候网路卡,且可能出现发送失败,其中转圈就是在捕获抛出)

在没有交换机的情况下,一个以太网就是一个碰撞域

所有发送的数据的主机都要进行碰撞检测和碰撞避免

二.协议分层

2.1 软件分层的好处

假设你和别人打电话,那么在语言层有汉语协议,通信设备层有电话机协议等等,进行协议分层,实现解耦

在这个例⼦中, 我们的"协议"只有两层:语⾔层、通信设备层。
但是实际的⽹络通信协议,设计的会更加复杂, 需要分更多的层
但是通过上⾯的简单例⼦,我们是能理解,分层可以实现解耦合,让软件维护的成本更低(改变只需修改局部,无需整体)

2.2 OSI七层模型

• OSI(Open System Interconnection,开放系统互连)七层⽹络模型称为开放式系统互联参考
模型,是⼀个逻辑上的定义和规范;
• 把⽹络从逻辑上分为了7层. 每⼀层都有相关、相对应的物理设备,⽐如路由器,交换机;
• OSI 七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传
输;
• 它的最⼤优点是将服务、接⼝和协议这三个概念明确地区分开来,概念清楚,理论也⽐较完整.
通过七个层次化的结构模型使不同的系统不同的⽹络之间实现可靠的通讯;
• 但是, 它既复杂⼜不实⽤; 所以我们按照TCP/IP四层模型来讲解.(实用,但实现不了)

2.3 TCP/IP五层(或四层)模型

TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求.

• 物理层: 负责光/电信号的传递⽅式. ⽐如现在以太⽹通⽤的⽹线(双绞 线)、早期以太⽹采⽤的的同 轴电缆(现在主要⽤于有线电视)、光纤, 现在的wifi⽆线⽹使⽤电磁波等都属于物理层的概念。物 理层的能⼒决定了最⼤传输速率、传输距离、抗⼲扰性等. 集线器(Hub)⼯作在物理层.
• 数据链路层: 负责设备之间的数据帧的传送和识别. 例如⽹卡设备的驱动、帧同步(就是说从⽹线上 检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就⾃动重发)、数据差错校验等⼯ 作. 有以太⽹、令牌环⽹, ⽆线LAN等标准. 交换机(Switch)⼯作在数据链路层.
• ⽹络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识⼀台主机, 并通过路由表的 ⽅式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)⼯作在⽹路层.
• 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送 到⽬标主机.
• 应⽤层: 负责应⽤程序间沟通,如简单电⼦邮件传输(SMTP)、⽂件传输协议(FTP)、⽹络远程访问协议(Telnet)等. 我们的⽹络编程主要就是针对应⽤层.

三.再识协议

本质就是通信主机距离变远了
为什么要有TCP/IP协议?
• ⾸先,即便是单机,你的计算机内部,其实都是存在协议的,⽐如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,⽐如:SATA,IDE,SCSI等。只不过我们感知不到罢了。⽽且这些协议都在本地主机各⾃的硬件中,通信的成本、问题⽐较少。
• 其次,⽹络通信最⼤的特点就是主机之间变远了。任何通信特征的变化,⼀定会带来新的问题,有 问题就得解决问题,所以需要新的协议咯。

3.1什么是TCP/IP协议?

• TCP/IP协议的本质是⼀种解决⽅案
• TCP/IP协议能分层,前提是因为问题们本⾝能分层
所以我们应该认识到,主机通信本质是两个协议栈在通信

四.网络传输的基本流程

4.1局域⽹ 络传输流程图

局域⽹(以太⽹为例)通信原理
每台主机在局域⽹上,要有唯⼀的标识来保证主机的唯⼀性:mac地址

MAC地址⽤来识别数据链路层中相连的节点;
• ⻓度为 48 ⽐特位, 即 6 个字节. ⼀般⽤ 16 进制数字加上冒号的形式来表⽰(例如:
08:00:27:03:fb:19)
• 在⽹卡出⼚时就确定了, 不能修改. mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地 址, 可能会冲突; 也有些⽹卡⽀持⽤⼾配置mac地址).
• windows>ipconfig /all

4.2 协议封装和解包

用户A发给用户B,要从应用层开始进行协议封装,添加报头

有效载荷是除了该层对应的报头以外的


• 报头部分,就是对应协议层的结构体字段,我们⼀般叫做报头
• 除了报头,剩下的叫做有效载荷
• 故,报⽂ = 报头 + 有效载荷
报头必须做到,和有效载荷进行分离的能力
报头中必须包含,如何将自己的有效载荷交给上一层的具体协议

如果用户A发送给用户B,B在数据链路层发现链路报头与自己不匹配,那么就会直接丢弃,上层无法感知,而爬虫,抓包就是设置了混杂模式,进行获取
用户A是不断入栈,B是不断出栈,所以是用户栈
为什么自上往下封装

操作系统与硬件的管理规则应用程序无法直接操作硬件(如网卡)------ 操作系统是硬件的管理者,数据必须通过协议栈的层级传递,才能从应用程序到达网卡

4.3 跨⽹络传输流程图 :- 认识IP地址

IP 协议有两个版本, IPv4 和 IPv6 . 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是
指 IPv4
• IP 地址是在 IP 协议中, ⽤来标识⽹络中不同主机的地址;
• 对于 IPv4 来说, IP 地址是⼀个 4 字节, 32 位的整数;
• 我们通常也使⽤ "点分⼗进制" 的字符串表⽰ IP 地址, 例如 192.168.0.1 ; ⽤点分割的每⼀个
数字表⽰⼀个字节, 范围是 0 - 255 ;

对⽐IP地址和Mac地址的区别
• IP地址在整个路由过程中,⼀直不变(⽬前,我们只能这样说明,后⾯在修正)
• Mac地址⼀直在变
• ⽬的IP是⼀种⻓远⽬标,Mac是下⼀阶段⽬标,⽬的IP是路径选择的重要依据,mac地址是局域⽹转发的重要依据

五.socket编程预备

5.1 认识端口号

端⼝号( port )是传输层协议的内容.

• 端⼝号是⼀个 2 字节 16 位的整数;
• 端⼝号⽤来标识⼀个进程, 告诉操作系统, 当前的这个数据要交给哪⼀个进程来处理;
• IP地址 + 端⼝号能够标识⽹络上的某⼀台主机的某⼀个进程;
• ⼀个端⼝号只能被⼀个进程占⽤.
端⼝号范围划分

0 - 1023 : 知名端⼝号, HTTP, FTP, SSH 等这些⼴为使⽤的应⽤层协议, 他们的端⼝号都
是固定的.

1024 - 65535 : 操作系统动态分配的端⼝号. 客⼾端程序的端⼝号, 就是由操作系统从这个范
围分配的.

5.2理解 "端⼝号" 和 "进程ID" 解耦

你即可以有身份证,也可以有手机号,学号,变化时,只需改变某种身份的号码即可,无需改变大局
另外, ⼀个进程可以绑定多个端⼝号; 但是⼀个端⼝号不能被多个进程绑定;
进程 PID 属于系统概念,技术上也具有唯⼀性,确实可以⽤来标识唯⼀的⼀个进程,但是这样
做,会让系统进程管理和⽹络强耦合,实际设计的时候,并没有选择这样做。

5.3理解源端⼝号和⽬的端⼝号

传输层协议( TCP 和 UDP )的数据段中有两个端⼝号, 分别叫做源端⼝号和⽬的端⼝号. 就是在描述 "数据是谁发的, 要发给谁";
理解socket
• 综上, IP 地址⽤来标识互联⽹中唯⼀的⼀台主机, port ⽤来标识该主机上唯⼀的⼀个⽹络进程
• IP+Port 就能表⽰互联⽹中唯⼀的⼀个进程
• 所以,通信的时候,本质是两个互联⽹进程代表⼈来进⾏通信,{srcIp,srcPort,dstIp,dstPort}
这样的4元组就能标识互联⽹中唯⼆的两个进程
• 所以,⽹络通信的本质,也是进程间通信
• 我们把 ip+port 叫做套接字 socket
我们把 ip+port 叫做套接字 socketm

5.4 传输层的典型代表

5.4.1 认识TCP协议

此处我们先对 TCP ( Transmission Control Protocol 传输控制协议)有⼀个直观的认识; 后
⾯我们再详细讨论TCP的⼀些细节问题.
• 传输层协议
• 有连接
• 可靠传输
• ⾯向字节流(假设水一直流,你取一滴,一桶还是一盆看你自己)

5.4.2认识UDP协议

此处我们也是对 UDP ( User Datagram Protocol ⽤⼾数据报协议)有⼀个直观的认识; 后⾯再详
细讨论.
• 传输层协议
• ⽆连接
• 不可靠传输
• ⾯向数据报 (一次取一块)

可靠传输,即有手段来防止数据丢失等情况,确保数据传输成功,但不可靠传输也有好处
是中性词
不可靠传输,意味着结构不复杂,无需占据更多资源

5.5 网络字节序

• 发送主机通常将发送缓冲区中的数据按内存地址从低到⾼的顺序发出;
• 接收主机把从⽹络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到⾼的顺序保存; •
因此,⽹络数据流的地址应这样规定: 先发出的数据是低地址,后发出的数据是⾼地址.
• TCP/IP协议规定,⽹络数据流应采⽤⼤端字节序,即低地址⾼字节.
• 不管这台主机是⼤端机还是⼩端机, 都会按照这个TCP/IP规定的⽹络字节序来发送/接收数据;
• 如果当前发送主机是⼩端, 就需要先将数据转成⼤端; 否则就忽略, 直接发送即可;
小小小 对应小端

这些函数名很好记, h 表⽰ host , n 表⽰ network , l 表⽰ 32 位⻓整数, s 表⽰ 16 位短整
数。
• 例如 htonl 表⽰将 32 位的⻓整数从主机字节序转换为⽹络字节序,例如将IP地址转换后准备发
送。
• 如果主机是⼩端字节序,这些函数将参数做相应的⼤⼩端转换然后返回;
• 如果主机是⼤端字节序,这些函数不做转换,将参数原封不动地返回。

• 所有发送到⽹络上的数据,都必须是⼤端的!

六.socket 接口

bash 复制代码
// 创建 socket ⽂件描述符 (TCP/UDP, 客⼾端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端⼝号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建⽴连接 (TCP, 客⼾端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
相关推荐
barbyQAQ2 小时前
GitLab CI/CD 基本用法指南
java·ci/cd·gitlab
ISU(考研版)2 小时前
从零开始复现 ThinkPHP RCE:Docker + Burp Suite 实战
运维·docker·容器
数据知道2 小时前
MongoDB大数据量分页优化:避免skip()性能陷阱的替代方案
网络·数据库·mongodb
Franciz小测测2 小时前
基于FastAPI的自动化随机初始密码方案
运维·自动化·fastapi
yuanmenghao2 小时前
Linux 性能实战系列 - 附录 Valgrind介绍
linux·运维·服务器
任子菲阳2 小时前
学JavaWeb第七天——yml配置文件 & 后端实战Tlias案例
java·开发语言·spring
BUG?不,是彩蛋!2 小时前
AI智慧社区--实现修改密码、退出登录、动态路由
java·spring boot·后端·intellij-idea·mybatis
白狐_7982 小时前
从零构建飞书 × OpenClaw 自动化情报站(二)
java·自动化·飞书
主角1 72 小时前
Nginx安全
linux·运维·nginx