1.字节序(CPU对内存的访问顺序)
(1)一个字节有一个地址(C语言初阶)
(2)小端字节序:低位存放低地址
大端字节序:低位存放高地址
地址0x01020304中:高位在01 低位在04
(3)主机字节序&网络字节序
主机字节序:指的是机器本身的字节序,如果是大端,则主机字节序就是大端;如果是小端,主机字节序就是小端。
网络字节序:规定网络当中传输的字节序使用大端,如果小端机器在传数据的时候,需要将数据转化为大端字节序进行传输,对端机器默认传输过来的数据是大端字节序
问题:最常见的x_86体系架构是小端机器,怎样验证自己的机器是大端还是小端?
【解析】使用联合数据结构的特性:共用内存,int 为4字节,char为1字节
data.a=1-->(高位)00000000 00000000 00000000 00000001 (低位)
如果为小端时,b为:(高地址)00000000 00000000 00000000 00000001 (低地址),因为char类型为1字节,所以只能取后面1字节:(高地址)00000000 00000000 00000000 00000001 (低地址),即b为1;
如果为大端是,b为:(高地址)00000001 00000000 00000000 00000000(低地址),即b为0
#include <stdio.h>
int main()
{
//联合数据结构特性:共用内存,因此占用4字节
union Data
{
int a;
char b;
}data;
data.a=1;
if(data.b==1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
(4)结论:网络信息中数据的五元组信息除协议外,还有传输的真实源数据都需要转化为网络字节序来传输;当通信双方都是小端机器的时候,对于网络报头当中的ip和port还是必须遵守网络字节序的格式进行传输,否则网络链路上的转发设备无法正确的转发该条数据,因为双方都是小端机器,所以传输的数据可以不用进行字节序转换。
2.TCP和UDP的区别
TCP:面向连接、可靠传输、面向字节流
面向连接:TCP通信双方在发送数据之前,需要先建立连接,才能够发送数据
可靠传输:TCP保证传输的数据是可靠有序的到达对端
面向字节流:
1.对于传输的数据之前是没有明显的数据边界的
2.对于接受方而言,可以在接收数据的强狂下,可以接收任意字节的数据
UDP协议:无连接、不可靠、面向数据报
无连接:UDP通信双发在发送数据之前,是不需要进行沟通的,客户端只要知道服务端的ip和端口,就直接可以发送数据了
不可靠:不保证数据可靠到达对端的,并且不保证数据是按序到达
面向数据报:UDP对于应用层和传输层数据递交的时候,都是整条数据交付的