网络基础
-
基础概念
- ip地址:在网络中唯一标识一台主机
- port端口:在一台主机上标识一个进程 (二个字节16位整数,一个端口号只能被一个进程占用,一个进程可以绑定多个端口号)
-
ISO七层模型
物理层 链路层 网络层 传输层 会话层 表示层 应用层
表示层:图像、视频编解码、数据加密
会话层:建立会话,如session认证、断点续传。
-
TCP/IP五层模型
物理层: 负责光电信号传输;以太网协议;集线器
链路层: 负责相邻设备之间的数据帧传输;Ethernet协议; 交换机
网络层: 负责地址管理与路由选择; IP ARP(IP地址解析物理地址) ICMP(ping命令); 路由器
传输层: 负责端与端之间的数据传输; TCP,UDP
应用层: 负责应用程序之间的数据沟通; HTTP FTP SMTP DNS
-
主机字节序和网络字节序
-
主机字节序
网络通信的本质是不同的机器进行数据交换, 一般不同的机器有着不同的cpu型号,不同的cpu其字节序可能不一样,字节序指的是对于存储需要多个字节的整数,其字节在不同的机器内存中存储的顺序。
-
little-endlian(LE,小端编码)
对于一个整数值,如果使用小端字节序,整数的高位会存储在内存地址的高的位置,整数的低位存储在内存地址低的位置, x86架构使用的是小端编码
-
big-endlian (BE, 大端编码)
对于一个整数值,如果使用大端字节序,整数的高位存储在内存地址低的位置,整数的低位存储在内存地址高的位置上,这是最直观的字节序,JAVA程序、mac机器上的程序一般是大端编码方式
-
-
网络字节序
网络字节序是TCP/IP协议中规定好的一种数据表示格式,它与具体的cpu类型、操作系统等无关,从而可以保证数据在不同主机之间传输能够被正确解释,网络字节序采用大端编码,因此为了不同的机器和系统可以正常交换数据,需要将传输的整型值转换成网络字节序
// 判断本机是否是网络字节序 bool isNetByteOrder() { unsigned short mode = 0x1234; char *pmode = (char*)mode; // 如果低地址放低位 if(*pmode == 0x34) { return false; } return true; } // htons 主机序转网络序 uint16_t htons(uint16_t hostshort); { //如果已经本机字节序是网络字节序,则直接返回 if (isNetByteOrder()) return hostshort; return ((uint16_t)(hostshort >> 8)) | ((uint16_t)((hostshort & 0x00ff) << 8)); } short >> 8)) | ((uint16_t)((hostshort & 0x00ff) << 8)); }
-