网络编程 - 网络体系结构 (字节序转化)

网络通信 - 网络中的主机进行数据的交换
就像现实生活中的寄快递一样
寄快递
包裹 – 快递小哥(收件人和寄件人的信息)
||
快递站点(仓库管理员)
||
司机(运输)
||
快递站点
||
快递小哥(派件)
||
目的地

快递公司管理体系:分职位
				  协同工作(约定)

1、网络体系结构:网络层次结构和每层所使用的协议的集合
特点:网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务
协议的集合:互联网是一个复杂的数据通讯系统,完成一些特定的任务需要众多的协议协同工作,这些协议分布在参考模型的不同层中的,因此有时称它们为一个协议栈。
按层次划分后在每一层上定义不同的协议,一是针对性强,二是互不干扰。
2、两个重要的体系结构:
OSI七层模型、TCP/IP 模型

OSI七层模型 - 理想化的模型

1) 应用层 - 与应用程序界面沟通,展示给用户
HTTP:超文本传输协议 - 基本的客户机/服务器的访问协议
浏览器向服务器发送请求,服务器回应相应的网页
FTP: 文本传送协议
提供交互式的访问
TFTP:简单文件传送协议
只支持文件传输,不支持交互
SMTP:简单邮件传送协议 - 用于电子邮件的传递
POP3:邮局协议 - 用于邮箱管理和用户邮件的存取
DNS: 域名解析协议 - 将域名转化为IP地址

2) 表示层 - 数据格式定义、数据加密和解密
3) 会话层 - 为通信双方指定通信方式,并创建、注销会话
4) 传输层 - 差错处理/恢复,流量控制,提供可靠的数据传输
TCP协议 - 面向连接的可靠的传输层协议
是一种一对一的通信方式
提供可靠的通信 - 传输的数据无差错、不丢失、不重复、并且按序到达
是一种全双工通信方式
适用情况:
对传输质量要求高,传输的数据量大的网络
对传输数据的可靠性要求高
账号登录,文件传输
TCP服务连接的建立:三次握手 (客户端 ->(SYN)->服务器->(SYN和ACK)->客户端->(ACK)->服务器 )
释放:四次挥手 (客户端 ->(FIN) ->服务器->(ACK)->客户端 ->(ACK) ->服务器
->(FIN) ->客户端
UDP协议 - 用户数据报协议,是不可靠的无连接的协议
发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延
支持一对一、一对多、多对一、多对多的交互通信
适用情况:
发送小尺寸数据
适用于给出应答较困难的网络
适合于广播/组播式通信
MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频
通常采用UDP协议
5) 网络层 - 为数据包分组,选择路由
IP协议 - 提供不可靠,无连接的数据报通信(不能保证IP数据报能成功到达目的地)
ICMP协议:控制报文协议
可以回送报文,用来检测网络是否通畅,ping指令
6) 数据链路层 - 将数据进行封装成帧,提供错误检测和纠正,以确保数据的可靠传输
ARP:地址解析协议
根据IP地址获取MAC地址
RARP:反向地址解析协议
将MAC地址转化为IP地址
7) 物理层 - 定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等

TCP/IP模型
1. 应用层 - (应用层、表示层、会话层)
2. 传输层
3. 网络层
4. 网络接口与物理层 - (数据链路层、物理层)

基本概念
1.P地址 - 标识网络中的主机
IPv4:32位 IPv6 128位
表示方式:点分十进制 192.168.1.40
无符号整型
IP地址分类:
网络号 + 主机号
A类IP地址:0网络号(8位) + 主机号(24位)
B类IP地址:10网络号(16位) + 主机号(16位)
C类IP地址:110网络号(24位) + 主机号(8位)
D类IP地址:1110网络号(32位)
E类IP地址:111110网络号(32位) - 保留

特殊IP地址
主机号全为1可以得到该网络的广播地址,表示该网络中的所有节点
IP地址全为0:表示整个网络,即网络中的所有主机。网络的路由,路由表中无法查询的包都将送到全零网络的路由中去
IP地址全为1:受限广播地址,只在本网络中广播,路由器不会去转发目的地址为255.255.255.255的数据包
127.0.0.0 – 127.255.255.255:本地网址,用于循环测试
数据包不经过网络传输,立即返回

子网掩码:可以屏蔽掉 IP 地址中的一部分,从而分离出 IP 地址中的网络部分与主机部分,是32位二进制的数值。可判断两台计算机是否属于同一个网段

子网掩码确定规则:
IP地址中的网络和子网标识部分都用二进制1表示
IP地址中的主机标识部分都用二进制0表示
网络号 = IP地址 & 子网掩码
标准子网掩码
A类:255.0.0.0
B类:255.255.0.0
C类:255.255.255.0
可根据需求设置子网掩码,对网络进行再次划分
PIv6:128位

  1. 端口号 - 标识进程
    16位无符号整型 - 0 - 65535
    公认端口:0 - 1023
    已登记端口:1024 - 49151
    动态或私有端口:49152 - 65535

  2. 套接字 - 标识网络连接
    服务器 - 插排
    套接字 - 插座
    客户端 - 插头

  3. 字节序
    大端模式: 高字节存储在低位地址中
    小端模式:高字节存储在高位地址中
    0x1234 地址: 0x0001 0x0002
    网络字节序:大端模式
    主机字节序:跟主机有关,不同主机采用的模式是不同的

     字节序的转化
     	测试主机字节序
     	int main(){
     		int a = 0x12345678;
     		char *p = (char *)&a;
     		
     		printf("*p: %x\n", *p);
    
     		return 0;
     	}
     	打印出 78 ,说明是小端模式
     	
     	主机字节序转网络字节序
     	uint32_t htonl(uint32_t hostlong);
     	uint16_t htons(uint16_t hostshort);
     	参数:待转化的数据
     	返回值:转化后的数据
     	
     	网络字节序转主机字节序
     	uint32_t ntohl(uint32_t netlong);
     	uint16_t ntohs(uint16_t netshort);
     	参数:待转化的数据
     	返回值:转化后的数据
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Linux 内核编程中,经常需要处理网络数据,因此需要进行网络字节转换。网络字节是指在网络上传输数据时使用的字节,它与主机字节(本地字节)不同。 在 x86 架构的计算机中,主机字节是小端(即低位字节存储在内存的低地址处),而网络字节是大端(即高位字节存储在内存的低地址处)。因此,在进行网络数据传输时,需要进行字节转换。 Linux 内核提供了一些函数用于进行字节转换,如: - htons() 和 ntohs() 函数用于将 16 位整数在主机字节网络字节之间转换。 - htonl() 和 ntohl() 函数用于将 32 位整数在主机字节网络字节之间转换。 这些函数都定义在头文件 <arpa/inet.h> 中。例如,将一个 16 位整数从主机字节转换为网络字节,可以使用以下代码: ```c #include <arpa/inet.h> uint16_t host_number = 12345; uint16_t network_number = htons(host_number); ``` 同样地,将一个 32 位整数从主机字节转换为网络字节,可以使用以下代码: ```c #include <arpa/inet.h> uint32_t host_number = 123456789; uint32_t network_number = htonl(host_number); ``` 反之,将一个从网络中接收到的数据从网络字节转换为主机字节,可以使用以下代码: ```c #include <arpa/inet.h> uint16_t network_number = 0x1234; uint16_t host_number = ntohs(network_number); ``` ```c #include <arpa/inet.h> uint32_t network_number = 0x12345678; uint32_t host_number = ntohl(network_number); ``` 需要注意的是,在进行字节转换时,必须使用适当的数据类型(如 uint16_t 和 uint32_t),否则可能会出现意外的错误。 ### 回答2: 在Linux内核编程中,网络字节转换是一个常见的操作,因为网络传输中使用的是大端字节(也称为网络字节),而计算机内部一般使用的是小端字节。 在进行网络通信时,需要将数据从主机字节转换为网络字节,以确保数据的正确传输和解析。同样,在接收到网络数据后,也需要将数据从网络字节转换为主机字节,以便正确地处理和使用这些数据。 在Linux内核中,提供了一系列的函数来进行字节的转换。其中,主要使用的函数为`htonl()`、`htons()`、`ntohl()`和`ntohs()`。它们分别代表主机到网络长整型、主机到网络短整型、网络到主机长整型和网络到主机短整型的转换。 这些函数的命名规则是根据网络字节的缩写和数据类型的缩写组合而成的。其中,h代表主机字节(host),n代表网络字节(network),l代表长整型(long),s代表短整型(short)。 使用这些函数进行字节转换非常简单。例如,要将一个32位整型数从主机字节转换为网络字节,可以使用`htonl()`函数,如下所示: ``` uint32_t value = 12345678; uint32_t network_value = htonl(value); ``` 同样地,要将一个网络字节的32位整型数转换为主机字节,可以使用`ntohl()`函数,如下所示: ``` uint32_t network_value = 0x1020304; uint32_t host_value = ntohl(network_value); ``` 总之,在Linux内核编程中,网络字节转换是非常常见的操作,可以使用`htonl()`、`htons()`、`ntohl()`和`ntohs()`这些函数来实现。这些函数提供了方便、简单和可靠的方式来进行字节的转换,以确保网络数据的正确传输和处理。 ### 回答3: 在Linux内核编程中,网络字节转换是一个非常重要的概念。网络字节,也被称为大端字节,是一种统一的字节,用于在网络中传输数据。而在计算机内部,一般使用的是主机字节,也就是与处理器相关的字节。为了在不同主机之间进行网络通信,就需要进行字节转换。 Linux内核提供了一系列函数用于进行字节转换,这些函数主要集中在`linux/in.h`和`linux/tcp.h`头文件中。其中最常用的函数是`htonl`、`htons`、`ntohl`和`ntohs`。它们分别用于将主机字节转换为网络字节和将网络字节转换为主机字节。 这些函数的原理是通过位操作和移位运算来实现字节的转换。例如,`htonl`函数可以将32位的整数从主机字节转换为网络字节,它将高位字节和低位字节进行位置交换。而`ntohl`函数则在将网络字节转换为主机字节时,执行与之相反的操作。 在实际的内核编程中,我们需要根据具体情况选择合适的字节转换函数。比如,在编写网络设备驱动程时,需要将设备收到的网络数据转换为主机字节进行处理,这时就可以使用`ntohl`和`ntohs`函数。而在将数据发送到网络上时,则需要将主机字节转换为网络字节,这时可以使用`htonl`和`htons`函数。 总而言之,通过Linux内核提供的网络字节转换函数,我们可以方便地进行主机字节网络字节之间的转换,从而实现跨主机的网络通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值