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:长度

相关推荐
geekrabbit4 分钟前
Ubuntu 22.04上安装Python 3.10.x
linux·python·ubuntu
ID_14 HuFei1 小时前
sed编辑器与awk的用法
linux·编辑器
驯龙高手_追风1 小时前
Ubuntu下安装最新版本Apache2文件服务器
linux·服务器·ubuntu
炸裂狸花猫2 小时前
Linux技术04-IPVS
linux·运维·服务器
J老熊2 小时前
Linux下抓包分析Java应用程序HTTP接口调用:基于tcpdump与Wireshark的综合示例
java·linux·运维·web安全·http·面试
HoweWWW2 小时前
k8s中的存储
linux·容器·kubernetes
我叫啥都行3 小时前
计算机基础知识复习9.13
linux·笔记·后端·系统架构
躺下睡觉~3 小时前
Unity-Transform-坐标转换
linux·unity·游戏引擎
库库的里昂4 小时前
【Linux修行路】网络套接字编程——UDP
linux·运维·服务器·网络·udp
Wang201220134 小时前
ubuntu下手工编译安装 6.* 最新内核
linux·运维·ubuntu