目录
2. 系统提供了有关主机字节序和网络字节序数据之间相互转换的函数
学习内容:
1. 网络体系结构及OSI开放系统系统互联模型
1.1 网络体系结构概念
每一层都有自己独立的功能,单每一层都不可获取
通常把功能相近的协议组织在一起放在一层,协议栈。所以每一层中其实有多个协议
分层的好处:
1、各层之间独立,每一层不需要知道下一层如何实现,而仅仅只需要知道该层通过层间的接口所提供的服务
2、稳定,灵活性好,当任何一层发生变化时,只需要层间接口关系保持不变,而这层以上或以下层不受影响
3、易于实现和维护(知道是什么功能,就到指定层去查找)
4、促进标准化工作:每一层的功能及其所提供的服务都有了精确的说明。
5、结构上不可分割开:各层都可以采用最合适的技术来实现
1.2 OSI开放系统互联模型
OSI是有 ISO(国际标准化组织)提出的一个理想化模型。
OSI共有七层:
物数网传会表应。
1.3 TCP/IP协议族(簇)的体系结构
TCP/IP协议簇是Internet事实上的工业标准。
TCP/IP网络体系结构四层:
应用层
传输层
网络层
链路层(网络接口和物理层)
1.4 TCP/IP四层结构中常见的协议
应用层:
HTTP(Hypertext Transfer Protocol) 超文本传输协议
万维网的数据通信的基础
FTP(File Transfer Protocol) 文件传输协议
是用于在网络上进行文件传输的一套标准协议,使用TCP传输
TFTP(Trivial File Transfer Protocol) 简单文件传输协议
是用于在网络上进行文件传输的一套标准协议,使用UDP传输
SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议
一种提供可靠且有效的电子邮件传输的协议
传输层:
TCP(Transport Control Protocol) 传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP(User Datagram Protocol) 用户数据报协议
是一种无连接、不可靠、快速传输的传输层通信协议
网络层:
IP(Internetworking Protocol) 网际互连协议
是指能够在多个不同网络间实现信息传输的协议
ICMP(Internet Control Message Protocol) 互联网控制信息协议
用于在IP主机、路由器之间传递控制消息、ping命令使用的协议
IGMP(Internet Group Management Protocol) 互联网组管理
是一个组播协议,用于主机和组播路由器之间通信
链路层:
ARP(Address Resolution Protocol) 地址解析协议
通过IP地址获取对方mac地址
RARP(Reverse Address Resolution Protocol) 逆向地址解析协议
通过mac地址获取ip地址
2. TCP和UDP异同(笔试面试)
共同点:同属于传输层的协议
TCP ----> 稳定
1> 提供面向连接的,可靠的数据传输服务
2> 传输过程中,数据无误、数据无丢失、数据无失序、数据无重复
1、TCP会给每个数据包编上编号,该编号称之为序列号
2、每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止
3> 数据传输效率低,耗费资源多
4> 数据收发是不同步的
1、为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象
2、该沾包算法称之为Nagle算法
5> TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议
例如:账户登录,大型文件下载的时候
UDP ----> 快速
1> 面向无连接的,不保证数据可靠的,尽最大努力传输的协议
2> 数据传输过程中,可能出现数据丢失、重复、失序现象
3> 数据传输效率高,实时性高
4> 限制每次传输的数据大小,多出部分直接忽略删除
5> 收发是同步的,不会沾包
6> 适用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下
例如:广播、通讯软件的音视频
3. 网络编程基础相关的概念
3.1 字节序
1> 回顾大端存储和小端存储:不同的主机在存储多字节整数时的存储方式有所不同,根据存储方式的不同,我们称为大端存储的主机和小端存储的主机
大端存储:地址低位存储数据高位
小端存储:地址低位存储数据低位
2> 验证主机大小端的方式
#include<myhead.h>
int main(int argc, const char *argv[])
{
/*用共用体的方式验证大小端
union
{
int num;
char ch;
}data;
//给整形数据赋值
data.num = 0x12345678;
//判断该数据的前一个字节(低地址位)中存储的数据
if(data.ch == 0x12)
{
printf("big endian\n");
}else if (data.ch == 0x78)
{
printf("little endian\n");
}*/
//使用指针的方式验证
int num = 0x12345678;
char *ptr = (char *)#
//判断起始地址中的数据
if(*ptr == 0x12)
{
printf("big endian\n");
}else if(*ptr == 0x78)
{
printf("little endian\n");
}
return 0;
}
3>如何实现主机字节序和网络字节序的转换
1. 手动实现大小端的转换
#include<myhead.h>
int main(int argc, const char *argv[])
{
//使用指针的方式验证
int num = 0x12345678;
char *ptr = (char *)#
//判断起始地址中的数据
if(*ptr == 0x12)
{
printf("big endian\n");
}else if(*ptr == 0x78)
{
printf("little endian\n");
//将其转换为大端
char *qtr = ptr + 3; //指向最后一个字节的数据
while(ptr < qtr)
{
//交换三部曲
char temp = *ptr;
*ptr = *qtr;
*qtr = temp;
//指针偏移
ptr++;
qtr--;
}
printf("num = %#x\n", num); //0x78563412
}
return 0;
}
2. 系统提供了有关主机字节序和网络字节序数据之间相互转换的函数
主机:host
网络:network
转换:to
#include<myhead.h>
int main(int argc, const char *argv[])
{
int num = 0x12345678; //定义四字节整数
short value = 0x1234; //定义两字节整数
int num_n = htonl(num); //将num转换为网络字节序
int value_n = htons(value); //将value转换为网络字节序
printf("num_n = %#x, value_n = %#x\n", num_n, value_n);
return 0;
}
3.2 ip地址
3.2.1. ip地址的分类
1、IPv4:采用一个4字节无符号整数存储,32bit,取值范围:【0,2^32-1】
局域网:local area network (LAN)
广域网:wide area network(WAN)
2、IPv6:采用16字节无符号整数存储,128bit,取值范围: [0, 2^128-1]
3.2.2. ip地址的划分
由于ip地址本身数字比较庞大,而且没有规律,为了更加方便有效的寻径,我们将IP进行二级划分,划分成两部分,分别是网络号和主机号
ip = 网络号 + 主机号
网络号:确定计算机从属的网络,在同一个网络下的多个主机的ip地址网络号都一样
主机号:标识设备在该网络中的主机编号
A类地址 | 0.0.0.0~127.255.255.255 | 2^7(网络号) | 2^24(主机号) | 已经保留不在供给 |
B类地址 | 128.0.0.0~191.255.255.255 | 2^14 | 2^16 | 名地址网管中心 |
C类地址 | 192.0.0.0~223.255.255.255 | 2^21 | 2^8 | 校园网或企业网、家庭网 |
D类地址 | 224.0.0.0~239.255.255.255 | 组播地址 | ||
E类地址 | 240.0.0.0~255.255.255.255 | 保留 |
3.2.3. ip地址点分十进制
为了方便记忆,我们将四字节ip地址的整数的每一个字节转换成十进制数,并使用点分割,组成一个字符串,这个字符串就是ip地址的点分十进制
但是,在网络传输中,ip地址展现的是4字节无符号整数的形式,所以在传输ip地址时,需要考虑字节序的问题
系统给大家提供了点分十进制与4字节无符号整数转换的函数
address:地址
network:网络
to:转换
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
功能:将点分十进制的ip地址转换为4字节无符号整数的网络字节序
参数:点分十进制
返回值:对应的4字节无符号整数的网络字节序
char *inet_ntoa(struct in_addr in);
功能:将ip地址的4字节无符号整数的网络字节序转换为点分十进制的字符串
参数:ip地址的网络字节序
返回值:点分十进制字符串
#include<myhead.h>
int main(int argc, const char *argv[])
{
const char *ip = "192.168.117.83"; //点分十进制
//将点分十进制字符串转换为4字节无符号整数的网络字节序
int ip_n = inet_addr(ip);
//输出网络字节序
printf("ip_n = %#x\n", ip_n);
//验证
printf("主机字节序:%#x\n", ntohl(ip_n));
return 0;
}
标签:字节,int,ip,编程,基础,网络,TCP,地址
From: https://blog.csdn.net/weixin_50357983/article/details/141090808