本文主要是介绍学习笔记第三十天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
网络通信基础
1. 物理层面
- 信息通路:包括有线(如光纤、铜缆)和无线(如5G、4G、星链)连接。
2. 软件/逻辑层面
- 需要建立逻辑上的通信通路,涉及网络编程和协议。
网络编程与OSI模型
OSI七层模型
- 物理层:定义物理连接的特性,如电气和机械特性,传输比特流。
- 数据链路层:负责节点间数据的成帧、传输和错误控制,传输帧数据。
- 网络层(网际层):处理网络间的数据传输,如IP协议,传输数据包。
- 传输层:提供端到端的可靠数据传输服务,如TCP或不可靠的数据传输服务,如UDP。
- 会话层:管理和维护两个节点间的会话。
- 表示层:数据的表示、加密和压缩等。
- 应用层:提供网络应用服务,如HTTP、FTP、SMTP等。
TCP/IP模型
- 实际应用中常用的是TCP/IP模型,包括四层:应用层、传输层、网络层、网络接口层(或数据链路层)。
操作系统角度
- 用户层:应用层,程序员接触的地方。
- 内核层:包括传输层、网络层、数据链路层、物理层,操作系统已经实现这些层次,如TCP/IP协议栈。
IP地址与端口号
- IP地址:用于标识网络中的一台主机,通常为32位(IPv4)或128位(IPv6)整型数值,表示方式为点分十进制(IPv4)。
- 端口号:用于标识主机中的一个具体进程,与IP地址结合构成进程的网络地址。
网络编程协议
TCP(传输控制协议)
- 特点:
- 面向连接:通信前需建立连接。
- 可靠传输:保证数据无误、无丢失、无失序、无重复。
- 面向字节流:传输数据时不区分应用层消息的边界。
- 适用情况:
- 对传输质量要求高。
- 传输大量数据。
- QQ等即时通讯软件的登录管理等功能。
UDP(用户数据报协议)
- 特点:
- 不可靠:不保证数据可靠传输。
- 无连接:发送数据前无需建立连接。
- 数据报:每个UDP报文独立处理。
- 适用情况:
- 发送小尺寸数据(如DNS查询)。
- 实时性要求高或难以建立连接的场景(如无线网络)。
- 广播/组播通信。
- 即时通讯软件的点对点文本通讯、音视频通讯。
- 流媒体传输等。
-
Socket 函数
int socket(int domain, int type, int protocol);
- 功能:程序向内核请求创建一个新的套接字描述符,用于网络通信。
- 参数:
domain
:地址族,指定套接字通信的协议族。常见的值有AF_INET
(IPv4)和AF_INET6
(IPv6),以及AF_UNIX
用于同一台机器上的进程间通信。type
:套接字类型。常见的值有SOCK_STREAM
(流式套接字,基于TCP),SOCK_DGRAM
(数据报套接字,基于UDP),以及SOCK_RAW
(原始套接字,直接操作IP层)。protocol
:指定使用的协议。通常设置为0,让系统根据前两个参数自动选择协议。
- 返回值:成功时返回一个新的套接字描述符,失败时返回-1,并设置相应的errno值。
-
Sendto 函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
- 功能:向指定的地址发送数据。适用于无连接的数据报套接字(如UDP)。
- 参数:
sockfd
:套接字描述符。buf
:指向要发送数据的缓冲区。len
:发送数据的字节数。flags
:发送选项,通常设置为0。dest_addr
:指向目的地址的指针,包含IP地址和端口号。addrlen
:dest_addr
参数的长度。
- 返回值:成功时返回发送的字节数,失败时返回-1,并设置相应的errno值。
-
sockaddr_in 结构体
struct sockaddr_in { sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 端口号,网络字节序 */ struct in_addr sin_addr; /* IP地址 */ }; struct in_addr { uint32_t s_addr; /* IP地址,网络字节序 */ };
sockaddr_in
结构体用于表示IPv4地址和端口号。sin_family
字段通常为AF_INET
。sin_port
字段是端口号,使用网络字节序(大端序)。sin_addr
字段是一个in_addr
结构体,表示IP地址,也使用网络字节序。-
字节序转换函数
- 主机到网络(Host to Network):
htonl
:32位主机字节序转换为网络字节序。htons
:16位主机字节序转换为网络字节序。
- 网络到主机(Network to Host):
ntohl
:32位网络字节序转换为主机字节序。ntohs
:16位网络字节序转换为主机字节序。
-
字符串转换函数
- 主机地址字符串到网络字节序:
inet_addr
:将点分十进制的IP地址字符串转换为网络字节序的IP地址。
- 网络字节序IP地址到主机地址字符串:
inet_ntoa
:将网络字节序的IP地址转换为其点分十进制的字符串表示形式。注意,inet_ntoa
返回的是指向静态内存的指针,因此不适合在多线程环境中使用。
-
recvfrom
函数ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
- 功能:从指定的套接字接收数据,并可以获取发送方的地址信息。
- 参数:
sockfd
:套接字描述符。buf
:指向接收数据的缓冲区的指针。len
:缓冲区的大小。flags
:接收选项,通常设置为0表示默认(阻塞)方式。src_addr
:指向sockaddr
结构体的指针,用于存储发送方的地址信息。如果不需要该信息,可以设置为NULL。addrlen
:src_addr
的大小,或者如果是输出参数,则为接收到的地址信息的实际大小。
- 返回值:成功时返回接收到的字节数,失败时返回-1。
-
bind
函数int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 功能:将套接字与特定的IP地址和端口号绑定。在服务器端,这用于指定监听的接口;在客户端,虽然不是必需的,但可以用于指定源地址。
- 参数:
sockfd
:通过socket
函数创建的套接字描述符。addr
:指向sockaddr
结构体的指针,通常使用sockaddr_in
结构体(对于IPv4)或sockaddr_in6
结构体(对于IPv6),包含IP地址和端口号。addrlen
:addr
参数的大小。
- 返回值:成功时返回0,失败时返回-1。
connect函数
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:该函数固定有客户端使用,表示从当前主机向目标
主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
addr 远程目标主机的地址信息。
addrlen: 参数2的长度。
返回值:成功 0;
失败 -1;
这篇关于学习笔记第三十天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!