Linux网络通信

网络的体系结构

网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层 提供的服务。

网络体系结构即指网络的层次结构和每层所使用的协议的集合。

两类非常重要的体系结构:OSI和 TCP/IP。

OSI模型相关的协议已经很少使用,但模型本身非常通用

OSI模型是一个理想化的模型,尚未有完整的实现

OSI模型共有七层 二层交换机,三层交换机

TCP/IP协议族体系

TCP/IP协议族体系是Internet事实上的工业标准。

TCP:传输控制协议

IP:互联网协议

UDP:用户数据报协议

ICMP:互联网控制消息协议

......

一共有四层:应用层,传输层,网络层,网络接口和物理层

每一层都负责不同的功能,并通过接口与相邻层进行交互

网络各层的协议解释

1.网络接口和物理层

mac地址:48位全球唯一,网络设备的身份标识

ARP:地址解析协议,IP地址找到mac地址

RARP:mac地址--找到IP地址

PPP协议:拨号协议(GPRS/3G/4G)

2.网络层

IP地址

IP协议:Internet protocol(分为IPv4和IPv6)

ICMP:Internet控制管理协议,Ping 命令属于ICMP

IGMP:Internet分组管理协议,广播和组播

3.传输层

TCP:(Transfer Control protocol,传输控制协议)提供面向连接的,一对一的可靠传输的协议

数据无误,数据不丢失,数据无失序

适用场景 :

适合对传输质量 要求较 ,以及传输大量数据的通信

在需要可靠数据传输的场合,通常适用TCP协议

MSN/QQ等即时通讯软件的用户登录账号管理相关的功能通常采用TCP协议

UDP:(user Datagram Protocol,用户数据报协议):提供不可靠,无连接的传输协议

适用场景

发送小尺寸数据(如对DNS服务器进行IP地址查询时)

在接收数据,给出应答较困难的网络中适用UDP(如无线网络

适合于广播/组播式通信中

MSN/QQ/Skype等即时通讯软件的点对点文本通讯 以及音视频通讯常采用UDP协议

流媒体,VOD,VoIP,IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输

SCTP:(Stream Control Transmission Protocol:流控制传输协议),TCP的增强版 ,他能实 现多主机多链路的通信

4.应用层

网页访问协议:HTTP/HTTPS

邮件发送接收协议:POP3(收)/SMTP(发),IMAP(可接受邮件的一部分) FTP:文件传输协议

Telnet/ssh:远程登录

嵌入式相关:

NTP:网络时钟协议

SNMP:简单网络管理协议(实现对网络涉及集中式管理)

RTP/RSTP:用于传输音视频的协议(安防监控)

网络的封包和拆包

封包:指将用户数据按照一定的规则和格式封装成数据包

封包以便在网络中进行传输的过程。这个过程包括将用户数据分割成适合网络传输的数据块(没每次经过一个阶段就会增加一个控制信息),并为每个数据块添加必要的控制信息(如源地址、目的地址、长度、校验和等),最终形成一个完整的数据包。

封包过程

  1. 数据分割:将要传输的数据按照一定的大小(如MTU,最大传输单元)进行分割,形成多个小的数据块。
  2. 添加控制信息:为每个数据块添加必要的控制信息,如源地址、目的地址、数据包长度、校验和等。这些信息通常被封装在数据包的头部(Header)中。
  3. 封装成数据包:将添加了控制信息的数据块按照特定的协议格式进行封装,形成一个完整的数据包。

拆包:收方在收到数据包后,根据数据包中的控制信息将其还原成原始用户数据的过程

即封包的逆过程,包括从数据包中剥离控制信息,并将剩余的数据块重新组合成原始的用户数据。

拆包过程

  1. 解析数据包:接收方首先解析数据包的头部信息,获取数据包的来源、目的地、长度和校验和等控制信息。
  2. 剥离控制信息:将数据包中的控制信息剥离出来,以便后续处理。
  3. 数据重组:根据数据包中的长度信息,将剩余的数据块按照顺序重新组合成原始的用户数据。

粘包:发送方发送的多个小数据包被接收方一次性接收,形成一个大的数据包。这可能是由于TCP的"流"特性以及网络状况等因素造成的。在执行拆包时,有可能导致数据包大小超过接收方的缓冲区大小,会把大的数据包拆解成多个小的数据包。

解决办法:

  • 发送端给每个数据包添加包首部,包含数据包的长度信息,以便接收端根据长度信息来拆分数据包。
  • 将数据包封装为固定长度,如果数据不足,则通过补0等方式填充至固定长度。
  • 在数据包之间设置边界,如添加特殊符号等,以便接收端能够识别数据包的边界。

TCP/IP协议下的数据包

MTU:最大传输单元

以太网:1500

mss:网络类型,线路,特性相关

网络预备知识

1.socket

是一个编程接口,是一个特殊的文件描述符(对他执行IO的操作函数,比如read,write,close等),并限于 TCP/IP协议,面向连接TCP,无连接UDP。

socket代表网络编程的一种资源

分类

1.流式 套接字(SOCK_STREAM)。唯一对应TCP

提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送顺序接收。内射击流量控 制,避免数据流淹没慢的接收方。数据被看作式字节流,无长度限制。

2.数据包 套接字(SOCK_DGRAM)。唯一对应UDP

提供无连接服务器,数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重 复,顺序发送,可能乱序接收。

3.原始套接字(SOCK_RAW)。对应多个协议,发送穿透了传输层

可以对较低层次协议如IP,ICMP直接访问。(可以跳过多个层次)

2.IP地址

IP地址是Internet中主机的标识,Internet中的主机要与别的机器通信必须具有一个IP地址,IP地址为32位(Ipv4)或者128位(Ipv6),每个数据包都必须携带目的 IP地址和IP地址,路由器依靠此信息为数据包选择路由

表示的形式:常用点分形式,如202.38.64.10,最后都会转化成一个32位的无符号整数

mobileIPV6:local IP(本地注册的IP),roma IP(漫游IP)

特殊IP地址 :

局域网IP: 192.XXX.XXX.XXX 10.XXX.XXX.XXX

广播IP:xxx.xxx.xxx.255 255.255.255.255(全网广播) 网络风暴

组播IP:224.xxx.xxx.xxx ~239.xxx.xxx.xxx

3.端口号

16位数字,1-65535,

为了区分 一台主机接收到数据包 应该转交给哪个任务进程处理使用端口号区别

预留端口,1-1023(FTP:24, SSH:22, HTTP: 80 ,HTTPS :469)

保留端口:1024-5000(不建议使用)

可以使用的端口: 5000~65535

TCP端口号于UDP端口号独立

网络里的通信是由 IP地址+端口号 来决定的

4.字节序

字节序是指不同的CPU访问内存中的多字节数据时候,存在大小端的问题

如果CPU访问的是字符串,则不存在大小端问题

一般来说X86/ARM : 小端模式

power/miop:arm作为路由时,大端模式

网络传输的时候采用大端模式

大端小端知识点:

一、定义

  • 大端模式(Big Endian):在这种模式下,数据的高位字节(Most Significant Byte,MSB)存储在内存的低地址中,而数据的低位字节(Least Significant Byte,LSB)则存储在内存的高地址中。这类似于人类从左到右的书写习惯,最高有效位(MSB)在左,最低有效位(LSB)在右。
  • 小端模式(Little Endian):与小端模式相反,数据的低位字节存储在内存的低地址中,而高位字节则存储在内存的高地址中。这类似于逆序书写,从右到左的顺序。

二、示例

以16位整数0x1234为例:

  • 在大端模式下,其在内存中的表示是0x12 0x34,即高位字节0x12在前,低位字节0x34在后。
  • 在小端模式下,其在内存中的表示是0x34 0x12,即低位字节0x34在前,高位字节0x12在后。

三、优缺点

  • 大端模式的优点
    • 符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小。
  • 小端模式的优点
    • 内存的低地址处存放低字节,所以在强制转换数据时不需要调整字节的内容(例如,将int的4字节强制转换成short的2字节时,可以直接使用int数据存储的前两个字节)。
    • CPU做数值运算时从内存中依顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效。

在网络通信中,由于不同主机可能使用不同的大小端字节序,因此需要在网络协议中明确指定数据的字节序,以确保数据能够正确地被解析。例如,TCP/IP协议栈采用大端字节序进行传输, 因此在网络通信中,如果客户端和服务器运行在不同的体系结构 上(比如一个在小端CPU上,另一个在大端CPU上),就需要 进行字节序的转换

字节转换函数 :

把给定系统所采用的字节序称为主机字节序,为了避免不同类别主机之间在数据交换时由于对于字 节序的不同而导致的差错,引入了网络字节序。

主机字节序到网络字节序

u_long htonl(u_long hostlong);

u_short htons(u_short short);

网络字节序到主机字节序

u_long ntohl(u_long hostlong);

u_short ntohs(u_short short);

IP地址的转换

inet_aton()

将strptr所指的字符串转换成32位的网络字节序二进制值

inet_addr()

功能同上,返回转换后的地址 仅适用于IPV4,出错时返回-1。 局限性:不能用于255.255.255.255的转换

inet_ntoa()

将32位网络字节序二进制地址转换成点分十进制的字符串

inet_pton()

int inet_pton(int af, const char* src ,void* dst)

将IPV4/IPV6 的地址转换成binary格式

使用于IPV4/IPV6

能正确处理255.255.255.255的转换问题

参数:

1.地址协议族(AF_INET或AF_INET6)

2.src:是一个指针(填写分点形式的IP地址(主要指IPV4))

dst:转换的结果给到dst

inet_ntop(int af,const void *src,char *dst,socklen_t size)

把ipv4和ipv6的网络字节序变成本地的字符串形式的IP地址 参数

1.af:地址协议族(AF_INET或AF_INET6)

2.src:是一个指针(32)

3.dst:输出结果为32位点分形式的IP地址

4.size:长度

相关推荐
Peter·Pan爱编程16 分钟前
Docker在Linux中安装与使用教程
linux·docker·eureka
kunge20131 小时前
Ubuntu22.04 安装virtualbox7.1
linux·virtualbox
清溪5491 小时前
DVWA中级
linux
Sadsvit2 小时前
源码编译安装LAMP架构并部署WordPress(CentOS 7)
linux·运维·服务器·架构·centos
xiaok2 小时前
为什么 lsof 显示多个 nginx 都在 “使用 443”?
linux
苦学编程的谢3 小时前
Linux
linux·运维·服务器
G_H_S_3_3 小时前
【网络运维】Linux 文本处理利器:sed 命令
linux·运维·网络·操作文本
Linux运维技术栈3 小时前
多系统 Node.js 环境自动化部署脚本:从 Ubuntu 到 CentOS,再到版本自由定制
linux·ubuntu·centos·node.js·自动化
拾心213 小时前
【运维进阶】Linux 正则表达式
linux·运维·正则表达式
Gss7774 小时前
源代码编译安装lamp
linux·运维·服务器