Linux网络基础(一)

网络基础1:

1.网络发展史

网络的划分:局域网,城域网,广域网;互联网-因特网;以太网;令牌环网
IP地址:在网络中唯一标识一台主机
IPV4:uint32_t类型的整数-DHCP/NAT
IPV6:uin8_t ip[16];
在网络中的每一条数据都会包含两个元素:源端IP地址-对端IP地址

PORT端口:

在主机上唯一标识的一个网络通信进程;
uint16_t类型的整数:
在网络中的每一条数据都会包含两个元素:源端端口-对端端口
在一台主机上,一个端口只能被一个进程占用,一个进程可以使用多个端口。

协议:约定—网络通信协议–网络通信中的数据格式约定

ISO:

OSI七层网络互连模式:以提供的服务不同将网络通信环境划分为7层
层次划分:应用层-表示层-会话层-传输层-网络层-链路层-物理层
TCP/IP五层模型:
应用层:负责应用程序之间的数据沟通:FTP,HTTP,
传输层:负责进程之间的数据传输:UDP,TCP,
网络层:负责地址管理与路由选择:IP,路由器
链路层:负责相邻设备之间的数据传输:交换机-以太网-ETH
物理层:负责光电信号的传输-集线器-以太网协议

网络通信流程:数据封装与分用

网络字节序:

主机字节序:一台主机上CPU对内存中数据按照字节为单位进行存取的顺序
分类:大端:低地址存高位;小端:低地址存低位
一个变量/数组的起始地址就是低地址,随着下标变大而变大
字节序针对的数据类型:存储单元大于一个字节的数类型:short/int/long/float/double
主机字节序的分辨:union(int a,char b;)tmp; tmp.a1; tmp.b1;
网络字节序:网络通信中的字节序标准–大端字节序
在网络通信,不同字节序的主机进行通信有可能会造成数据二义

套接字socket编程:

网络通信程序的编写
在网络通信程序的编写中,涉及到应用层以下各层协议的选择-传输层
传输层:
TCP:–传输控制协议:面向连接,可靠传输,面向字节流-可靠的传输通信协议
TCP协议应用于安全要求大于实时要求的场景–文件传输
UDP:–用户数据报协议:无连接,不可靠,面向数据报–不可靠的传输通信协议
UDP协议应用于实时性要求大于安全性的场景–视频/音频的数据传输
UDP网络通信程序的编写:
客户端:主动发起请求的一方–用户的一端
服务端:被动接受请求的一方–向用户提供服务的一端
网络通信程序的编写都使用的是套接字接口–socket接口

客户端服务端1.创建套接字-使进程与网卡之间建立联系1.创捷套接字-在内核中创建socket结构体2.为套接字绑定地址信息,每条数据中都有源端地址和对端地址;绑定的地址就是源端地址信息;(客户端不建议主动绑定)2.为套接字绑定地址信息-给内核创建的socket结构体中添加IP,PORT信息,告诉操作系统哪些数据应该放到这个socket的缓冲区中交给哪个进程处理3.发送数据(如果没有绑定地址则会选择合适的进行绑定)3.接收数据-从对应socket结构体的接收缓冲区中取出数据4.接收数据()4.回复数据-通过接收数据时获取的发送端地址信息进行数据回复5.关闭套接字释放资源5.关闭套接字释放资源

接口创建:
1.创建套接字:
int socket(int domain,int type,int protocol);
domain;地址域类型–AF_INET;
type:套接字类型–SOCK_STREAM-字节流服务/SOCK_DGRAM-数据报服务
protocol:协议类型-0-默认类型/IPPROTO_UDP
字节流服务默认是TCP协议;数据报服务默认是UDP协议
返回值:成功返回一个非负整数-套接字描述符;失败返回-1;
2.为套接字绑定地址信息:
int bind(int sockfd, const struct sockaddr*addr, socklen_t addrlen);
sockfd; 创建套接字返回的操作句柄
addr: struct sockaddr 不同的地域有对应不同的地址结构
struct sockaddr; struct sockaddr_in; struct sockaddr_un;
addrlen:实际地址结构长度
返回值:成功返回0;失败返回-1;
3.发送数据:
ssize_t sendto(int fd, void *buf, size_t len, int flags, struct sockaddr *addr, socklen_t addrlen);
fd: 套接字操作句柄
buf: 要发送的数据的空间首地址
len: 数据长度
flag: 默认0-阻塞发送
addr:对端地址信息
addrlen: 地址信息长度
返回值:成功返回实际发送的数据字节长度;失败返回-1;
4.接收数据:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *scr_addr, socklen_t *addrlen);
sockfd:套接字操作句柄
buf:放置数据的缓冲区空间首地址
len:要接收的数据长度(不能大于上边缓冲区长度)
flag:默认0-阻塞接收
src_addr: 发送端地址信息的接收缓冲区
addrlen: socklen_t * 输入输出参数,指定想要的地址长度,返回实际地址长度
返回值:成功返回实际接收的数据字节长度;失败返回-1;
5.关闭套接字:
int close(fd);
6.地址转换接口:
htons/htonl:主机字节序到网络字节序的整数转换 short-16/int-32
ntohs/ntohl:网络字节序到主机字节序得整数转换 short-16/int-32
点分十进制字符串IP地到网络字节序整数IP地址的转换
in_addr_t inet_addr(const char *cp); inet_addr(192.168.2.2)
int inet_pton(int af–地址域,const char *src, void *dst);
af–地址域类型-AF_INET;src–字符串IP地址, dst:返回的转换后的整数地址
网络字节序整数IP地址到点分十进制字符串IP地址的转换
char *inet_ntoa(struct in_addr in);

猜你喜欢

转载自blog.csdn.net/WEIYANGBIN/article/details/113407335