网络编程(一)
- 网络基础
- 网络体系结构
- **OSI的7层模型**:(理想化)
- **每层的功能**
- **TCP/IP的4层模型**:(在使用)
- 常见的协议
- IP地址
- IPV4
- 分类
- A类(第1位固定为0)
- B类(第1,2位固定为10)
- C类(前3位固定为110)
- D类(组播地址)(前4位固定为1110)
- E类(保留地址)(前四位固定为1111)
- IPV6
- 网络协议
- 端口号
- 范围
- 字节序
- 主机字节序
- 网络字节序(**本身大端序**)
- 主机字节序转化成网络字节序(htons/htonl)
- 网络字节序转化为主机字节序(ntohl/ntohs)
- 如何实现网络通讯
- 封包解包
网络基础
网络体系结构
定义:网络的分层模型和每层所使用的协议的集合
网络体系结构有两种:OSI的7层模型和TCP/IP的4层模型
OSI的7层模型:(理想化)
开放系统互连参考模型 (Open System Interconnect 简称OSI)
七层(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)
每层的功能
物理层:定义物理设备的标准,主要对物理连接方式,电气特性,机械特性等制定统一标准,传输比特流,因此最小的传输单位——位(比特流)
数据链路层:主要是对物理层传输的比特流包装,检测保证数据传输的可靠性,将物理层接收的数据进行MAC(媒体访问控制)地址的封装和解封装,也可以简单的理解为物理寻址。交换机就处在这一层,最小的传输单位——帧
网络层:控制子网的运行,如逻辑编址,分组传输,路由选择最小单位——分组(包)报文
传输层:定义一些传输数据的协议和端口。传输协议同时进行流量控制,或是根据接收方接收数据的快慢程度,规定适当的发送速率,解决传输效率及能力的问题——tpdu
会话层:负责在网络中的两节点建立,维持和终止通信,在一层协议中,可以解决节点连接的协调和管理问题。包括通信连接的建立,保持会话过程通信连接的畅通,两节点之间的对话,决定通信是否被终端一斤通信终端是决定从何处重新发送,最小单位——spdu
表示层:确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密,最小单位——ppdu
应用层:文件传输,文件管理,电子邮件的信息处理
TCP/IP协议:
TCP/IP的4层模型:(在使用)
“四层”:应用层,传输层,网络层,网络接口和物理层
TCP/IP与OSI参考模型的对应关系
常见的协议
IP(27)、tcp(77)、udp(110)、ping(64)
IP地址
定义:在网络中唯一标识一台主机的符号
MAC地址–》物理地址(硬件地址),唯一标识一台主机的符号
IPV4
4代表
- (版本号)
- (IPV4协议维护的IP地址的宽度是4byte=32bit)所以IPV4地址有2^32次方个,范围是0.0.0.0~255.255.255.255
分类
A类(第1位固定为0)
范围:0.0.0.0~127.255.255.255
A类地址 = 网络号(8bit)+主机号(24bit)
- A类地址网络号第一位固定为0,其他七位可以分配,主机号长度为24位
- 网络号分配的数量为2^7 = 128,地址范围为:1.0.0.0~127.255.255.255
- 10.0.0.0-10.255.255.255是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址,路由器接收到私有地址,不会向Internet转发该分组,私有地址与NAT相关)
- 127.0.0.0-127.255.255.255是保留地址,用做循环测试用的
- 0.0.0.0—0.255.255.255也保留用作特殊用途
- 因此网络号可分配的只有128-3 =125个,每个网络段的主机号可以分配的只有 2^24-2=16777214个(主机号全0和主机号全1保留)
B类(第1,2位固定为10)
范围:128.0.0.0~191.255.255.255
B类地址 = 网络号(16bit)+主机号(16bit)
- B类地址网络号第1,2位固定为10,其它14位可以分配,主机号长度为16位
- 地址范围为:128.0.0.0—191.255.255.255
- 172.16.0.0—172.31.255.255是私有地址
- 169.254.0.0—169.254.255.255是保留地址(如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IP)
- 每个网络段可分配的主机号为2^16 - 2 = 65534(主机号全0和主机号全1保留)
C类(前3位固定为110)
范围192.0.0.1 ~ 223.255.255.254(全0全1不用和1号地址)
2^8-3个主机
C类地址 = 网络号(24bit)+主机号(8bit)
- C类地址网络号前3位固定为110,其它21位可以分配,主机号长度为8位
- C类地址范围:192.0.0.0—223.255.255.255
- 192.168.0.0—192.168.255.255是私有地址
- 网络号可分配的块数为2^21 = 2097152,每个网络号可分配的主机号数为2^8-2 = 254(主机号全0和主机号全1保留)
D类(组播地址)(前4位固定为1110)
范围224.0.0.1 ~ 239.255.255.254
D类IP地址不标志网络,前4位固定为1110,地址范围为:224.0.0.0—239.255.255.255,用作特殊用途,如多播地址
E类(保留地址)(前四位固定为1111)
240~保留地址
E类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1111。E类地址范围:240.0.0.0—255.255.255.255,用于某些实验和将来使用
总结:
- A类地址的第1块网络号和第2块网络号要保留
- ABC三类地址的主机号全0和全1都保留,主机号全1为子网广播地址,主机号全0为子网网络地址(一个网段中第一个IP地址为网络地址)
ABC三类地址中的特殊IP地址
- 直接广播地址
如果主机号全1,例如191.1.255.255,那么这个地址为直接广播地址路由器将这个分组以广播的形式发送到网络号位191.1.x.x的全部主机 - 受限广播地址
网络号与主机号的32位全为1(255.255.255.255)为受限广播地址用来将一个分组以广播方式发送给本网的所有主机 - “这个网络上的特定主机”地址
网络号是全0 (如0.0.0.25) 的地址是这个网络号的特定主机地址路由器接到这样的分组,不向外转发,而是直接交付给本网络中主机号为25的主机 - 回送地址
A类地址中127.0.0.0是回送地址,它是一个保留地址
IPV6
IPv6地址采用”冒号十六进制表示法“,将128位地址按每16位划分为一个位段,每个位段转换为一个4位的十六进制数
-
冒号十六进制表示法:
21DA : 0000 : 0000 : 0000 : 02AA : 000F : FE08 : 9C5A -
如果某段存在几位都是0的情况,可以使用零压缩法压缩:
21DA : 0 : 0 : 0 : 2AA : F : FE08 : 9C5A
零压缩法:00D3(D3),02AA(2AA),000A(A),0000(0),但是AB08不能压缩为AB8
-
如果存在几个连续位段都是0,可以用”双冒号表示法“(双冒号只能出现一次)
21DA : :2AA : F : FE08 : 9C5A
用”双冒号表示法“表示的一个问题:如何确定冒号省略的段数?
8 - 现有段数 = 冒号省略的段数
网络协议
定义:在网络通信中对某种通信规则的约定
分类:
-
网络通用协议(TCP/IP协议)
-
行业专用协议
-
自定义协议
端口号
为了区分一台主机接受到的数据包应该转交给那个进程来进行处理,使用端口号来区别
TCP端口号与UDP端口号独立
端口号作用:用于区分应用程序
范围
端口号是一个16位的无符号整数,范围1-65535(0不用),其中1-1023已被占用。用户可用的是1024~65535之间
字节序
分类:主机字节序,网络字节序
主机字节序
概念:不同的CPU主机存储多字节整数的方式,有小端主机字节序和大端主机字节序(大小端由CPU决定)
小端序:将数据的低字节存放在内存的低地址
大端序:将数据的低字节存放在内存的高地址处
案例:验证虚拟机是大端序还是小端序
#include <stdio.h>
//功能:使用指针判断虚拟机是大端序还是小端序
int main(int argc, const char *argv[])
{int a = 0x12345678;char* p = &a;if(0x78 == *p){printf("虚拟机为小端序\r\n");}else{printf("虚拟机为大端序\r\n");}return 0;
}
#include <stdio.h>
//功能:使用共用体判断虚拟机是大端序还是小段序
typedef union myunion
{char a;int b;
}myunion;
int main(int argc, const char *argv[])
{myunion un;un.b = 0x12345678;if(0x78 == un.a){printf("虚拟机为小端序\r\n");}else{printf("虚拟机为大端序\r\n");}return 0;
}
网络字节序(本身大端序)
把给定系统所采用的字节序称为主机字节序。为了避免不同类型主机之间在数据交换时由于对于字节序的不同而导致的差错,引入网络字节序
作用:用作适配不同类型的主机的主机字节序
提前转化:0x12345678–>转化0x78563412
主机字节序转化成网络字节序(htons/htonl)
u_long htonl(u_long hostlong);//32bit使用
u_short htons(u_short short);//小于32bit使用
网络字节序转化为主机字节序(ntohl/ntohs)
u_long ntohl(u_long hostlong);
u_short ntohs(u_short short);
如何实现网络通讯
封包解包