1. IP地址
- ip地址在
网络中
唯一标识一台主机
1.1 IPv4
- 本质上是一个
无符号整型32位
的整数,范围在0~2^32
,整个ip地址占用4个字节
- 通常标识ip时,使用
点分十进制
的方式来表示
例如:192 . 168 . 153 . 128
以
.
分割,每一个数字
都占用一个字节
,这个数字的取值范围为[0 , 255]
1.2 IPv6
- 本质上是一个
无符号整型128位
的整数,范围在0~2^128
,整个ip地址占用16个字节
- 通常标识ip时,使用
冒分16进制
的方式来表示
例如:ABCD : EF01 : 2345 : 6789 : ABCD : EF01 : 2345 : 6789
以
:
分割,每一个数字
都占用两个字节
,这个数字的取值范围为[0 , 0xffff]
2. MAC地址
- MAC地址用于
在网络中
唯一标示一个网卡
,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址 - MAC地址本质上是一个
无符号整型48位
的整数,使用冒分16进制
的方式来表示,整个MAC地址占用6个字节
例如:08 : 00 : 27 : 03 : fb : 19
以
:
分割,每一个数字
都占用一个字节
,这个数字的取值范围为[0 , 0xff]
3. port端口号
- 在一台机器中唯一标识一个进程
- 本质上是一个无符号整型16位的整数,范围在0~2^16,整个port端口号占用2个字节
- 端口号用来标识一个进程,告诉操作系统,当前的数据交给哪一个进程来处理
- IP地址+端口号 能够唯一标识网络上的某一台主机的某一个进程
- 一个端口号只能被一个进程占用
- 一个进程可以绑定多个端口号,一个端口号只能被一个进程绑定
- 源端口号:标识数据是从哪里发的
- 目的端口号:标识数据要发到哪里
4. 字节序
- 主机字节序:取决于电脑本身的字节序是大端字节序还是小端字节序
- 网络字节序:规定网络当中传输数据使用的是大端字节序
意味着:如果你的主机字节序是小端字节序,那么你通过网络进行传输数据之前,需要把你的数据从小端字节序转化为大端字节序
- 常见的
X86体系结构
的操作系统是小端字节序
机器
检测本机字节序算法
#include <stdio.h>
#include <unistd.h>
int main()
{
union D
{
int a;
char b;
}data;
data.a = 1;
if(data.b = 1)
printf("小端字节序\n");
else
printf("大端字节序\n");
return 0;
}
5. 字节序转换接口
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
- 将
ip地址
从主机字节序转换为网络字节序
使用htonl接口
- 将
ip地址
从网络字节序
转换为主机字节序使用ntohl接口
- 将
port端口号
从主机字节序转换为网络字节序
使用htons接口
- 将
port端口号
从网络字节序
转换为主机字节序使用ntohs接口
6. TCP协议与UDP协议的区别
TCP:
面向连接
:TCP通信双方在发送数据之前,需要先建立连接,才能发送数据传输可靠
:TCP保证传输的数据是可靠有序的到达对端- 面向
字节流
:字节流中的数据是没有明显的边界的:一堆数据放在一起成为一个序列,看不出来任何的实际意义
UDP:
无连接
:UDP通信双方在发送数据之前,是不需要进行预先沟通的,客户端只需要知道服务端的IP地址和端口号,就可以发送数据了不可靠
:不保证数据能够可靠达到对端,也不保证数据到达的先后顺序- 面向
数据报
:UDP对于应用层和传输层数据递交的时候,都是整条数据交付的