网络相关

网络字节序

考虑一个16位整数,它由两个字节组成。 内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,称为小端字节序,另一种是将高序字节存储在起始地址,称为大端字节序。两种格式都有系统使用。

  网络上传输的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高位字节还是低位字节处理,是一个比较有意义的问题;
  UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的;
  所以说,网络字节序是大端字节序;
  在实际中,当在两个存储方式不同的主机上传输时,需要借助字节序转换函数。

在Unix网络编程中,需要用到下列这四个函数进行字节序的转换

include <netinet/in.h>

uint16_t htons(uint16_t hostbitvalue);
uint32_6 htonl(uint32_t hostbitvalue);
返回网络字节序的值

uint16_t ntohs(uint16_t hostbitvalue);
uint32_t ntohl(uint16_t hostbitvalue);
返回主机字节序的值

OSI七层模型从低到高分别是:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

TCP/IP模型则是:数据链路层,网络层,传输层,应用层