文章目录
- 数据在不同层之间的名称
- 数据的跨网络传输
- 端口号
- TCP协议与UDP协议
- 网络字节序
- 套接字编程的种类
数据在不同层之间的名称
以TCP/IP
模型为例,数据在不同层之间有不同名称;
-
应用层(Applicant Layer)
数据名称一般为 消息(Message),请求/响应(Request/Response);
在这一层中数据通常被称为消息,包括
HTTP
请求,SMTP
邮件等应用协议的数据; -
传输层(Transport Layer)
数据称为 段(Segment)
在这一层中数据被分割为段,如果使用的是
TCP
协议,数据会附加传输控制信息形成TCP
段;对于
UDP
段,则称为数据报(Datagram); -
网络层(Network Layer)
数据名称为 包(Packet)
在这一层中数据被封装成包,这个包包含了源和目的的
IP
地址等信息; -
数据链路层(Data Link Layer)
数据名称为 帧(Frame)
在这一层,数据被封装成帧,这个帧包含物理地址(MAC地址)等信息,用于在局域网中传输;
-
物理层(Physical Layer)
数据名称为 比特(Bits)
在物理层,数据被转换为光电信号或无线信号,以比特的形式在物理介质上传输;
不同层次的数据单位各自承担特定的网络功能,确保数据能够从一台设备有效传输到另一台设备;
数据的跨网络传输
-
IP
地址IP
地址是在网络层用于识别网络上各个设备的数字标识符;是互联网协议的一部分,用于在网络上路由数据包到正确的目的地,
IP
地址可以分为两类:-
IPv4
使用
32
位二进制数表示,通常以点分十进制(192.168.1.1
)的形式显示;IPv4
地址空间有限,最大可提供约43
亿个唯一地址; -
IPv6
为了应对
IPv4
地址耗尽的问题,IPv6
采用了128
位地址长度,以十六进制表示,分为八组;提供了几乎无限的地址空间;
IP
地址具体可以分为网络地址和主机地址两部分,其中网络地址标识主机所在网络,主机地址标识该网络中的具体设备; -
-
MAC
地址MAC
地址也被称为物理地址或硬件地址,是嵌入到网络设备(如网卡)中的唯一标识符,MAC
地址通常由设备制造商在生产时分配,并嵌入到设备的固件中;MAC
地址使用48位或64位地址长度,通常以十六进制形式表示,分为六组;MAC
地址主要作用是在数据链路层控制网络设备之间的数据通信,当数据包在同一个物理网络段内传输时,它首先利用MAC
地址确定目标设备从而完成数据的传递;
数据在跨网络进行传输时本质上是一个封装与解包的过程;
一个需要进行网络通信的主机向另一台主机发送消息需要经历以下步骤:
-
应用层数据生成
应用程序需要生成需要发送的数据,这个数据被封装在应用层协议中,例如
HTTP
,SMTP
等; -
传输层封装
数据从应用层传递到传输层,数据在这里会被封装在传输层协议中,常见的有
TCB
和UDP
;传输层回味数据包分配源端口号和目标端口号,以表示应用层的具体服务(如
HTTP
默认使用80
端口); -
网络层路由选择
传输层数据被进一步封装在网络层协议中,即
IP
协议;网络层添加源
IP
和目标IP
;随后主机将会查询路由表,根据目标
IP
地址决定数据包的下一跳,即将数据包发给哪个路由器或网关;其中在传输过程中
IP
地址是不变的,MAC
地址是不同变化的,MAC
地址通常为当前设备的MAC
地址与目标(下一跳)的MAC
地址用于逐层跳跃; -
链路层封装
当前设备将具有一定的算法为数据拟定一个路线进行逐次跳跃,如果主机不知道下一跳的设备(如路由器)的
MAC
地址,将会通过ARP
协议查询对应的IP
地址,而后对该IP
地址进行询问,该询问将通过一个广播的形式,只有对应IP
地址的设备会进行返回,返回其对应的MAC
地址;-
ARP
协议查询过程请求: 主机会在本地的网络内广播一个
ARP
请求帧,这个请求包含了目标设备的IP
地址,请求的大致内容为"谁是IP为x.x.x.x
的设备? 请告诉我你的MAC
地址";广播性质:
ARP
请求通过单播发送,意味着当前网络中的所有设备都会收到这个请求;ARP
响应: 由于通过单播发送,只有拥有该IP
地址的设备回应这个请求并为其提供MAC
地址;ARP
缓存: 一但主机得到目标设备的MAC
地址,会将该信息存储在ARP
缓存中,以便在需要再次发送数据时不必重复发送ARP
请求; -
链路层数据帧构建
在获得下一跳的
MAC
地址后,主机可在链路层中构建数据帧,这个数据帧包含了源MAC
地址(发送主机的MAC
地址),目标MAC
地址(下一跳设备的MAC
地址),数据有效载荷(从网络层传递下来的IP
数据包);
链路层完成封装后,数据帧将被转换为物理信号,通过网络介质发送到下一跳设备;
-
以该图为例,若是接受的设备是路由或网关而不是目标主机意味着当前设备为路径点设备,及原主机发送到目标主机的途径点;
在该途径点中(路由)将接受数据帧并检查帧头中的目标MAC
地址;
若是目标MAC
地址与当前设备不相同则直接忽略,若是相同则解包提取IP
数据包,并根据IP
数据包中的源IP
和目标IP
进行查找其路由表以确定下一跳的IP
地址,并根据该地址封装其对应的MAC
地址;
相同的若是不知道下一跳的MAC
地址是多少,将同样的会以单播的形式发送一个ARP
请求;
当ARP
请求已经被响应,即对方已经返回了对应的MAC
地址后将会构建新的数据帧,根据目标网络介质(如以太网,令牌环网)等协议,将IP数据包重新封装到新的链路层栈帧中;
其中帧头信息包括新的源MAC
地址(路由器的出接口MAC
地址)和新的目标MAC
地址(下一跳的设备的MAC
地址);
-
物理层传输
最后路由器将重新封装好的数据帧发送到对应的出接口,通过物理介质传到下一跳的设备;
如图所示,数据的跨网络传输本质上就是一个不断在封装与解包的过程;
在Linux中通常可使用ipconfig
查看当前计算机与网络有关的信息;
端口号
用户使用应用软件完成发送数据和接收数据本质上是两个进程在进行通信,而网络只是用于通信的介质,这意味着两台进程进行通信本质上就是进程间通信;
本质上就是操作系统通过提供系统调用接口使用网络协议栈通过网络来完成不同主机上不同进程间的通信;
端口号是计算机网络中用语标识特定进程或网络服务的一个概念,在网络通信中起到区分不同应用程序的作用;;
通常情况下端口号是一个16
位的数字,范围从0
至65535
,用于标识主机上的待定应用程序或服务;
在网络通信中IP
地址用于标识网络上的唯一主机,而端口号则用于标识主机上的具体进程或服务,一个公网IP
与当前IP
主机上的端口号可以标识为一个全网中唯一的进程;
-
传输层协议
端口号通常与传输层协议
TCP
或UDP
配合使用,TCP
(传输控制协议)和UDP
(用户数据报协议)是两种常见的传输协议;它们为应用程序提供了数据传输的基础;
用户使用应用层软件完成数据的发送和接收,而网络协议栈中的下三层主要解决的是数据安全可靠的送到远端主机;
端口号通常分为以下几种:
-
知名端口号
这些端口号由
IANA
分配,并被广泛用于知名服务与协议;-
HTTP
(Web
服务) :80
-
HTTPS
(加密了的Web
服务) :443
-
FTP
(文件传输协议) :21
-
SSH
(安全外壳) :22
-
DNS
(域名系统) :53
-
SMTP
(简单邮件传输协议) :25
-
-
注册端口 (
1024
-49151
)这些端口号通常分配给特定的应用程序或是公司,用于某些专有协议或服务;
-
MySQL
数据库 :3306
-
Microsoft SQL Server
:1433
-
PPTP
(点对点隧道协议) :1723
-
-
动态/私有端口(
49152
-65535
)这些端口通常不会分配给固定的服务,而是在需要时动态分配;
客户端通常在这个范围内选择端口号来与服务器进行通信;
通常情况下系统不会为进程分配网络端口号,而是对于客户端应用程序而言,当它打开一个网络连接时其对应的操作系统将为其分配一个动态的网络端口号作为源端口号来进行通信;
通常对于服务端而言其端口号必须是被客户端所知的,故通常情况下服务端的端口号是固定不动的;
通常服务端通常需要保证服务不中断以满足多个客户端发出的请求并进行响应;
端口号无论对于client
和server
都能唯一的标识;
-
端口号和进程
ID
之间的关系端口号和进程
PID
之间本质上没有关系;进程
PID
用于标识当前进程在当前系统中的唯一性;端口号用于当前系统中需要使用网络服务的进程的唯一性;
因为不是所有的进程都需要网络通信,但是所有的进程都要有
PID
;同时因为端口号为网络功能,
PID
为系统功能,两者之间必须进行解耦合,以提高其可维护性;
通常情况下可能存在一个对应的数据结构(如哈希)来管理当前主机接收到的网络请求,这个网络请求通常与进程和端口号有关;
一个进程可以绑定多个端口号,但是一个端口号只能被一个进程绑定;
TCP协议与UDP协议
TCP
(传输控制协议)与UDP
(用户数据报协议)是两个常用的传输层协议,用于网络通信,其在功能,性能和使用场景上有显著差异;
-
TCP
协议-
传输层协议
TCP
是一种传输层协议,位于OSI
模型的第四层;在传输层,
TCP
负责提供面向连接,可靠的通信服务,以确保数据在网络上传输的完整性和顺序性; -
面向连接
TCP
是面向连接的协议,在传输数据之前,TCP
要求通信双方(双端,即客户端和服务端)必须先建立联系;这一过程通过"三次握手"完成,以确保双方都准备好发送数据和接受数据;
数据传输完成后
TCP
会使用"第四次挥手"来优雅地关闭连接; -
可靠传输
TCP
提供可靠的数据传输机制,通过序列号,确认应答,重传机制和超时重传等技术以确保所有数据包都能按顺序无误的到达接收方;如果数据包在传输过程中丢失或损坏,
TCP
会自动重新发送这些数据包; -
面向字节流
TCP
是面向字节流的协议;将数据看作是一个连续的字节流,数据可以任意大小传输并无边界;
TCP
会将应用层的数据流分割成合适大小的段,并且确保这些段按顺序无误地到达接收方;
-
-
UDP
协议-
传输层协议
UDP
同样的是一种传输层协议,位于OSI
模型的第四层;不同于
TCP
,UDP
提供的是一种简单,无连接的传输服务,适用于对速度要求较高且可靠性要求不高的应用场景; -
无连接
UDP
是一种无连接的协议,在发送数据前UDP
并不需要建立联系;数据包可以直接从发送方传输到接收方,使得
UDP
的传输速率更高; -
不可靠传输
UDP
不保证数据包的可靠性,因此数据包可能在传输过程中丢失,重复或乱序;UDP
不会采取任何措施纠正这些问题,为了其传输速率,UDP
协议在发出一个数据包后就不会对该数据包进行维护; -
面向数据报
UDP
是面向数据包的协议,将数据划分成一个个独立的数据包,每个数据报在网络上传输时是一个独立的实体且具有边界,通常为单个数据报提供较小的负载;
-
此处无论是是否有连接,是否可靠都不为一个褒义词或是贬义词;
其本质是在描述该协议的属性特点;
其中是否可靠而言此处的可靠是需要不小的代价的,TCP
协议需要将数据不出任何差错的情况下始终维护该协议直到该数据成功到达对端,若是在任何位置数据包出现丢失或是损坏时都要进行重发;
同时TCP
处理数据包丢失的前提是两段之间建立联系;
UDP
由于将数据包发出后无需再对该数据包进行管理故其具有高效的传输速度;
网络字节序
计算机中数据和传输为大端与小端两种方式;
-
大端字节序
大端字节序中数据的高位字节存储再内存的低地址处,低位字节存储在内存的高地址处,这意味着数据从左到右存储;
假设一个四字节的十六进制数
0x12345678
,其在内存中的存储顺序为如下:-
0x00
: 存储12
-
0x01
: 存储34
-
0x02
: 存储56
-
0x03
: 存储78
-
-
小端字节序
小端字节序中数据的低位字节存储在内存的低地址处,数据的高位字节存储在内存的高地址处,即数据从右往左进行存储;
以四字节的十六进制数
0x12345678
,其在内存中的存储顺序如下:-
0x00
: 存储78
-
0x01
: 存储56
-
0x02
: 存储34
-
0x03
: 存储12
-
网络字节序指的是在网络通信中使用的标准字节序的顺序;
TCP/IP
协议规定,多字节数据在传输数据时必须采用大端字节序,这意味着数据的高位字节先传输,低位字节后传输;
统一的字节序使不同计算机系统之间能够正确解释数据,无论本地的字节序是大端还是小端;
本质上采用大端字节序作为网络字节序主要是为了标准化,确保在不同系统之间数据能够被正确的解码,若是未指定字节序标准,当大端字节序接受到小端字节序发送的数据时将会解码错误;
对于用户而言主要需要手动进行转换的数据类似于IP
或端口等数据;
套接字编程的种类
-
域间套接字
域间套接字是一种用于同一主机上的进程间通信的方法;
不涉及网络传输,只是在本地文件夹系统路径命名空间内工作;
域间套接字使用文件系统路径作为地址,无
IP
地址和端口的概念;其对应的结构体为
struct sockaddr_un
;struct sockaddr_un { sa_family_t sun_family; // 地址族,通常为 AF_UNIX 或 AF_LOCAL char sun_path[108]; // 文件路径,最大长度通常为 108 字节 };
-
原始套接字
原始套接字允许开发者直接处理网络层,如
IP
层或链路层的数据包;开发者可以手动构建和解析数据包的报头,甚至自定义协议;
这种编程方式需要较高的权限,因为其允许直接访问网络设备的底层接口,可能会影响系统的网络行为;
其对应的相关结构体为
struct sockaddr_in
与struct sockaddr_ll
;其中
struct sockaddr_in
在原始套接字编程种,该结构体仍用于处理IP
地址和端口号,但由于开发者直接操作网络层,通常还需要自行构造IP
头部和其他协议头部;struct sockaddr_ll
是一个用于链路层的地质结构体,通常在直接处理网络接口时使用:struct sockaddr_ll { unsigned short sll_family; // 地址族,通常为 AF_PACKET unsigned short sll_protocol; // 协议类型,如 ETH_P_IP int sll_ifindex; // 接口索引 unsigned short sll_hatype; // 硬件地址类型 unsigned char sll_pkttype; // 包类型 unsigned char sll_halen; // 硬件地址长度 unsigned char sll_addr[8]; // 硬件地址 };
-
网络套接字编程
网络套接字用语在不同主机之间的相互通信,通常采用
TCP/IP
协议进行网络通信;网络套接字是最常用的套接字类型,适用于大多数客户端-服务器架构的应用程序;
网络套接字可以通过
UDP
和TCP
协议进行传输,分别提供无连接服务和可靠有序的连接服务;其相关结构体为:
struct sockaddr_in { short int sin_family; // 地址族(AF_INET) unsigned short int sin_port; // 端口号 struct in_addr sin_addr; // IP地址 unsigned char sin_zero[8]; // 保留字段 };