网络基础-----C语言经典题目(12)
一、OSI模型是什么?有哪几层?
中文名称为开放系统互连参考模型,是计算机网络领域的基础理论模型。它将网络通信复杂过程划分为 7 个层次,每层负责特定功能。
OSI 模型的七层结构(从下到上)
1.物理层
功能:处理原始比特流(0/1信号)的传输,定义硬件接口(电缆、网卡、光纤等)、信号格式、传输速率等物理特性。
示例:RJ45 接口、WiFi 信号。
2.数据链路层
功能:在相邻节点间传输数据帧,负责错误检测(CRC 校验)、流量控制和链路管理。
子层:媒体访问控制(MAC层 )、逻辑链路控制(LLC 层)。
示例:以太网协议、PPP 协议。
3.网络层
功能:通过 IP 地址实现跨网络的数据包路由和寻址,选择最佳路径传输数据。
核心协议:IP(网络协议)、ICMP(错误报告)、ARP(MAC 地址解析)。
示例:路由器工作在这一层。
4.传输层
功能:为端到端(进程间)通信提供可靠或不可靠的数据传输,确保数据完整。
核心协议:
1.TCP(传输控制协议):面向连接、可靠传输(HTTP、FTP)。
2.UDP(用户数据报协议):无连接、不可靠传输(DNS、视频流)。
标识:通过端口号(port)区分不同应用进程(如 80 端口对应 HTTP)。
5.会话层
功能:建立、管理和终止应用程序间的会话连接,支持会话同步和恢复。
示例:远程登录的会话管理、断点续传。
6.表示层
功能:处理数据格式转换(加密、压缩、编码),确保不同系统间的数据兼容。
示例:JPEG 图像编码。
7.应用层
功能:直接为用户应用程序提供服务(文件传输、网页浏览),定义应用协议和规则和接口。
核心协议:HTTP、FTP等。
示例:浏览器访问网页(HTTP)、邮件客户端发送邮件(SMTP)。
二、简述 TCP / IP 网络模型(TCP / IP 协议栈)
TCP / IP 网络模型(协议栈)是实现网络通信的核心架构,核心思想是分层设计,各层通过协议规范交互。
TCP / IP 协议栈四层模型
1.应用层
功能:为用户提供直接服务(数据交换、文件传输等),定义应用程序间通信的协议规则。
常见协议:HTTP(超文本传输协议,Web 服务)、FTP(文件传输协议,文件上传 / 下载)
C语言实现:通过调用传输层接口(Socket)实现,数据以“消息”形式传递(HTTP请求、相应报文)。
2.传输层
功能:负责端到端的通信,确保数据可靠传输或高效传输,为应用层提供抽象的“端口”地址。
核心协议:
TCP(传输控制协议):
面向连接(三次握手建立连接,四次挥手断开),可靠传输。
数据单位:段。
UDP(用户数据报协议):
无连接,不可靠传输(无重传,低延迟)。
数据单位:数据报。
端口号:16 位整数(0 - 65535),标识应用进程(80端口对应 HTTP 服务)。
3.网络层
功能:实现主机间的逻辑寻址(IP 地址),负责数据包的路由和转发(跨网络传输)。
核心协议:IP(网络协议),定义 32 位 IPv4 地址,数据单位:分组(Packet)。
无连接、不可靠,仅负责“尽力而为”传输。
C语言交互:通过 Socket 选项可操作 IP 头部。
4.网络接口层(含数据链路层 + 物理层)
功能:处理物理硬件相关的传输,实现相邻节点间的数据传输。
数据链路层:定义物理地址(MAC 地址),数据单位:帧。
协议:以太网、PPP (点对点协议)等。
物理层:定义物理介质(网线、无线信号等)的电气 / 机械特性。
各层数据封装与交互
数据发送:应用层数据----》传输层加 TCP / UDP 头部---》网络层加 IP 头部---》数据链路层加 MAC 头部和尾部---》物理层转化为比特流。
三、常用的 TCP / IP 协议族中的网络协议是哪些?应用场合呢?
1.传输层协议
TCP
特点:面向连接、可靠、基于字节流,能保证数据无差错、不丢失且按序到达。
应用场合:对数据准确性要求高,但对传输速度要求不高的场景。比如 HTTP、HTTPS、。
C语言中:通过 Socket()、connect()、bind()、listen()、accept()等函数来实现基于 TCP 的网络编程。
UDP
特点:无连接、不可靠、面向数据报,不保证数据一定到达,也不保证数据按序到达,但传输速度快。
应用场合:对实时性要求高,但对数据准确性要求相对较低的场景。如视频直播、语音通话、实时游戏、DNS 等。
C语言中:使用sendto()、recvfrom()函数可以实现基于 UDP 的网络通信。
2.网络层协议
IP
功能:负责将数据包从源主机传输到目标主机,为数据包提供路由和寻址。
版本:广泛使用的是 IPv4,IPv6在普及。
ICMP
功能:用于在 IP 主机、路由器之间传递控制消息,比如错误报告、网络状况查询等。
应用:ping 命令和 traceroute 命令就是基于 ICMP 协议实现的。
3.应用层协议
HTTP / HTTPS
应用:网页浏览、API 调用等场景。HTTPS 是在 HTTP 的基础上加入了 SSL / TLS 加密。
SMTP / POP3 / IMAP
应用:电子邮件发送和接收。
四、交换机和路由器工作在 TCP/IP 模型中的哪一层,它们的主要工作区别是什么?
1.交换机:
工作在 TCP / IP 模型的数据链路层(第二层)。基于 MAC 地址转发数据帧,通过维护 MAC 地址表实现端口到 MAC 地址的映射。
2.路由器:
工作在 TCP / IP 模型的网络层(第三层)。基于 IP 地址转发数据包,通过路由表选择最佳路径,并处理跨网段通信。
特性 | 交换机 | 路由器 |
工作层级 | 数据链路层(第二层) | 网络层(第三层) |
寻址方式 | 基于 MAC 地址转发数据帧 | 基于 IP 地址转发数据包 |
转发决策 | 根据 MAC 地址表转发 | 根据路由表选择最佳路径 |
广播域 | 所有端口属于同一个广播域 | 每个接口属于独立的广播域 |
跨网段通信 | 仅支持同一网段内通信 | 支持不同网段间的通信 |
主要功能 | 连接局域网设备,提高网络带宽利用率 | 连接不同网络,实现广域网通信 |
协议处理 | 不关心上层协议(IP、TCP) | 处理 IP、路由协议 |
五、ip 地址的表现形式以及组成是什么?
以 IPv4 为例,表现形式和组成情况如下:
1.点分十进制表示法(字符串形式)
这是常用的一种 IP 地址表示方式,例如 192.168.1.1 。
char ip_str[] = "192.168.1.1";
2. 32 位无符号整数(网络字节序)
在计算机内部和网络传输时,IP 地址会被表示成 32 位无符号整数,采用大端字节序。
数据类型:in_addr_t
存储结构:sockaddr_in 结构体。
#include <netinet/in.h>struct sockaddr_in addr;
addr.sin_addr.s_addr = 0xC0A80101; // 对应192.168.1.1的十六进制表示
3.转换函数
1.字符串转整数(inet_aton)
#include <arpa/inet.h>// 方法一:inet_aton(适用于IPv4)
char* ip_str = "192.168.1.1";
struct in_addr addr;
inet_aton(ip_str, &addr); // 转换结果存储在addr中
2.整数转字符串(inet_ntoa)
// 方法一:inet_ntoa(适用于IPv4,返回静态字符串)
char* result = inet_ntoa(addr.sin_addr);
4.存储结构
struct in_addr {in_addr_t s_addr; // 32位IPv4地址(网络字节序)
};struct sockaddr_in {sa_family_t sin_family; // 地址族,AF_INETin_port_t sin_port; // 端口号(网络字节序)struct in_addr sin_addr; // IPv4地址char sin_zero[8]; // 为了保持与sockaddr结构长度一致
};
六、Ubnutu 中,配置静态 ip 地址的配置文件是哪个?
对于 Ubnutu 18.04 及后续版本,网络配置采用 Netplan 管理,配置文件存放在 /etc/netplan/ 目录下,文件名一般是 interfaces 。
七、查看本机有哪些网络链接的命令是什么?
netstat-anp
八、网络设备字节序和主机字节序是什么?
网络设备字节序
也称网络字节序,采用大端字节序。
主机字节序
指计算机在存储多字节数据时采用的字节顺序,由 CPU 架构决定。
大端字节序:数据的高位字节存于低地址,低位字节存于高地址。例如:
数值 0x12345678 在内存中的存储顺序是0x12、0x34、0x56、0x78。
小端字节序:与大端相反,低位字节存于低地址,高位字节存于高地址。例如:
数值 0x12345678 在内存中的存储顺序为0x78、0x56、0x34、0x12。
九、端口号的作用以及端口号的长度是什么?常用网络协议端口号有哪些?
端口号的作用
在同一台主机上对不同的网络应用程序进行区分。当操作系统接收到网络数据包后,会依据端口号将数据准确地转发给对应的应用程序。
端口号的长度
是一个 16 位无符号整数,取值范围是 0 到 65535。通常使用 in_port_t 类型来表示端口号。
常用网络协议端口号
HTTP:80
HTTPS:443
FTP:20(用于数据传输)、21(用于控制连接)
SMTP:25
DHCP:67(服务器端)、68(客户端)
十、TCP 和 UDP 的区别?
连接性
TCP:面向连接,数据传输前,要通过“三次握手”建立连接,数据传输结束后,要“四次挥手”断开连接。
UDP:无连接,发送数据前无需建立连接,直接把数据报发送出去就行。
可靠性
TCP:可靠,会通过序列号、确认应答、重传机制来保证数据能准确无误地到达接收方。
UDP:不可靠,不保证数据一定能到达接收方,也不处理数据的丢失。
有序性
TCP:有序。
UDP:可能无序。
传输效率
TCP:相对较低。
UDP:效率高、延迟低。
传输形式:
TCP:面向字节流,数据以连续的字节流形式传输,没有明显的边界。
UDP:面向数据报,有明确的边界。
应用场景
TCP:文件传输、网页浏览、电子邮件。
UDP:音视频播放、实时游戏、DNS查询。
TCP 编程基本流程
1.服务器端:创建套接字(socket)---》绑定地址(bind)---》监听连接(listen)---》接受连接(accept)---》收发数据(send / recv)---》关闭连接(close)
2.客户端:创建套接字(socket)---》连接服务器(connect)---》收发数据(send/recv)---》关闭连接(close)
UDP 编程基本流程
1.服务器端:创建套接字(socket)---》绑定地址(bind)---》收发数据(recvfrom/sendto)---》关闭套接字(close)
2.客户端:创建套接字(socket)---》收发数据(sendto/recvfrom)---》关闭套接字(close)
示例:
// TCP服务器示例
int main()
{// 创建套接字int server_fd = socket(AF_INET, SOCK_STREAM, 0);// 绑定地址struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8080);bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));// 监听连接listen(server_fd, 5);// 接受连接struct sockaddr_in client_addr;socklen_t client_addr_size = sizeof(client_addr);int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_size);// 收发数据char buffer[1024];read(client_fd, buffer, sizeof(buffer)-1);printf("收到消息: %s\n", buffer);write(client_fd, "Hello, client!", strlen("Hello, client!"));// 关闭连接close(client_fd);close(server_fd);return 0;
}// UDP服务器示例
int main()
{// 创建套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);// 绑定地址struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(8080);bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));// 收发数据char buffer[1024];struct sockaddr_in client_addr;socklen_t client_addr_size = sizeof(client_addr);recvfrom(sockfd, buffer, sizeof(buffer)-1, 0, (struct sockaddr*)&client_addr, &client_addr_size);printf("收到消息: %s\n", buffer);sendto(sockfd, "Hello, client!", strlen("Hello, client!"), 0, (struct sockaddr*)&client_addr, client_addr_size);// 关闭套接字close(sockfd);return 0;
}
十一、三次握手和四次挥手的过程是什么?为什么是四次挥手?
1.三次握手(建立 TCP 连接)
1.客户端发起连接:客户端向服务器发送一个带有 SYN 标志位的数据包,请求建立连接。
2.服务器确认并响应:服务器收到请求后,发送 SYN + ACK 包。
3.客户端最终确认:客户端收到服务器的 SYN + ACK 后,发送 ACK 包确认。
2.四次挥手(端口 TCP 连接)
1.客户端请求关闭:客户端数据发生完毕后,发送 FIN 包请求关闭连接。
2.服务器确认关闭:服务器收到 FIN 后,立即发送 ACK 包确认客户端的关闭请求。
3.服务器请求关闭:等到服务器数据发送完毕后,发送 FIN + ACK 包请求关闭服务器到客户端的连接。
4.客户端最终确认:客户端收到服务器的 FIN 后,发送 ACK 包确认。
四次挥手的原因:
1.三次握手中,合并 SYN + ACK的原因:服务器收到客户端的 SYN 包后,可以立即在一个数据包中同时发生 SYN(请求建立连接)和 ACK(确认客户端的 SYN),因为此时服务器尚未开始发送数据,无需等待其他操作。
2.四次挥手必须分开 ACK 和 FIN 的原因:当服务器收到客户端的 FIN 后,仅表示客户端不再发送数据,但服务器可能仍有未发送完的数据。因此,服务器需先发送 ACK 确认客户端的关闭请求(避免客户端超时重传 FIN),然后等到自身数据发生完毕后,再单独发送 FIN 包请求关闭服务器到客户端的连接。这两个操作(ACK 和 FIN)无法合并,所以需要四次挥手。
总结:
三次握手建立连接时,合并SYN + ACK ,减少一次交互,可以提高效率。
四次挥手断开连接时,因全双工特性和数据完整性要求,ACK 和 FIN 需分开发送。确保双向连接独立关闭。
十二、TCP 协议中还有哪些机制保障可靠运输?
1.序列号与确认应答机制
TCP 会为每个传输的字节都分配一个序列号,接收方收到数据后,会回传带有确认号(ACK)的应答,以此告知发送方哪些数据已成功接收。
2.超时重传机制
要是发送发在一段时间内没有收到某个数据包的确认应答,就会重新发送该数据包,这个等待时间被称为超时重传时间。
3.数据校验机制
TCP 会对每个数据包进行校验和计算,接收方在收到数据包后会重新计算校验和,以此来判断数据在传输过程中是否发送损坏。
十三、Wireshark 的作用是什么?如何使用?如何排查网络问题?
作用
数据包捕获与分析、协议分析、性能分析、故障排查。
使用方法
1.从 Wireshark 官网下载合适的版本。
2.启动与接口选择:启动 Wireshark 后,会显示可用的网络接口列表,选择要监控的网络接口(以太网、WiFi等),然后点击“Start”按钮开始捕获数据包。
3.过滤数据包:用过滤表达式,如
ip.src == 192.168.1.100:只显示源 IP 地址为 192.168.1.100 的数据包。
tcp.port == 80:只显示 TCP 端口号为 80 的数据包。
4.分析数据包:捕获到数据包后,Wireshark 会以树形结构显示每个数据包的详细信息。
排查网络问题:
确认通信是否建立:检查是否有 SYN、SYN-ACK、ACK 包来确认 TCP 连接是否成功建立。
检查数据包内容:查看数据包的负载数据,确认 C 程序发送和接收的数据是否正确。
检查丢包情况、分析网络延迟。