Linux网络基础
IP地址
- IP地址简介
IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP地址分类
- IPV4
无符号4字节的整形数据 unint32_t
功能:标识网络上的唯一主机
数据:无符号4字节的整形数据 unint32_t
数据传输过程简单说:源IP地址—>目的IP地址
数量:43亿-----不够用,解决措施如下:- 谁上网给谁分配------DHCP
- IP地址替换-----------NAT
- IPV6
无符号的16字节的整形数据,但是至今还没有被推广起来,因为IPV6不向下兼容IPV4,这就导致大多数使用IPV4开发的软件若是使用IPV6就需要重新进行二次开发,这样的投资太过巨大。
端口号PORT
端口号是传输层协议的内容
-
端口的简介
在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口,如ADSL Modem、集线器、交换机、路由器上用 于连接其他网络设备的接口,如RJ-45端口、SC端口等等。逻辑端口是指逻辑意义上用于区分服务的端口,如TCP/IP协议中的服务端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等。由于物理端口和逻辑端口数量较多,为了对端口进行区分,将每个端口进行了编号,这就是端口号 -
端口号的数据类型
端口号是一个2字节16位的整数 -
端口号的功能
- 端口号⽤用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理
- IP地址 + 端口号能够标识网络上的某⼀台主机的某一个进程
- 一个端口号只能被一个进程占用(在这个进程使用这个端口的这段时间内其他进程不能使用这个端口)
五元组
- 源IP地址
- 目的IP地址
- 源端口
- 目的端口
- 协议(SIP,SPOT,DIP,DPORT,PORTO)
- 功能
标识一条通信
网络字节序
字节序
- 字节序简介
字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 - 字节序的分类
- 大端字节序
大端字节序指的是高字节存储在低地址,低字节存储在高地址 - 小端字节序
小端字节序指的是低字节存储在低地址,高字节存储在高地址
- 大端字节序
- 字节序还分为: 主机字节序 与 网络字节序
- 字节序分的使用
通信双方无法确定对方电脑字节序时,发送字节存储数据就可能造成数据错误解决,因此就采用同一的字节序(网络字节序),保证传输数据的正确性 - 主机字节序
- 主机字节序取决于CPU,需要判断:
如何判断请看代码:
- 主机字节序取决于CPU,需要判断:
- Linux下运行:
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
unsigned long a = 0x12345678;
unsigned char* p = (unsigned char* )(&a);
//取a地址中的前两位
printf("主机的字节序:%0x %0x %0x %0x\n", p[0],p[1],p[2],p[3]);
unsigned long b = htonl(a);
//将主机字节序转化为网络字节序
p = (unsigned char* )(&b);
//取b地址中的前两位
printf("网络字节序:%0x %0X %0x %0x\n",p[0],p[1],p[2],p[3]);
return 0;
}
- 方法二
# include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char *)&i);
//取i在地址中存储的第一位
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
// 若是1则是低字节存低位,小端字节序
else
{
printf("大端\n");
}
//不是则是低字节存高位,大端字节序
return 0;
}
- 显示
78 56 34 12 —小端字节序
12 34 45 78 —大端字节序
网络字节序
- 网络字节序简介
网络字节序是TCP/IP中规定好的一种数据格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
网络字节序是大端字节序
规定使用网络字节序即统一为大端字节序