当前位置: 首页 > news >正文

网络基础-----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.应用层

        功能:直接为用户应用程序提供服务(文件传输、网页浏览),定义应用协议和规则和接口。

        核心协议:HTTPFTP等。

        示例:浏览器访问网页(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(网络协议),定义 32IPv4 地址,数据单位:分组(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 位无符号整数,取值范围是 065535。通常使用 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 程序发送和接收的数据是否正确。

        检查丢包情况、分析网络延迟。

http://www.xdnf.cn/news/231859.html

相关文章:

  • ActiveMQ 可靠性保障:消息确认与重发机制(一)
  • [实战] Petalinux驱动开发以及代码框架解读
  • Mac下安装Python3,并配置环境变量设置为默认
  • 深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning
  • 分组密码算法ShengLooog设计原理详解
  • 如何正确使用日程表
  • 【Java】equals、==、hashcode详解
  • 单片机的各个种类及其详细介绍
  • 复杂度和顺序表(双指针方法)
  • 国标GB28181视频平台EasyGBS在物业视频安防管理服务中的应用方案​
  • 进程地址空间
  • 在柯希霍夫积分法偏移成像中,旅行时计算中振幅和相位信息
  • 兰亭妙微:全流程交互设计和设计前后对比
  • 详细说明c++函数传参常量引用const T传递和值传递的区别
  • 【25软考网工】第四章(4)无线局域网WLAN安全技术、无线个人网WPAN
  • 【Kubernets知识】Secret组件更新大全
  • 设备安全管理:AI赋能的智能守护者
  • 建筑兔零基础python自学记录88|time库文本进度条(下)11
  • x-cmd install | Tewi - 终端里的 Transmission 掌控者,功能全面的 BT 下载管理工具!
  • 适配 AGP8.5,maven 私服发布报错(七)
  • Rust 学习笔记:枚举与模式匹配
  • HTTP 快速解析
  • php+mysql活动报名学生选课产品预定旅游报名系统网站源码
  • Spyglass:官方Hands-on Training(一)
  • 【容器化】Linux环境Docker在线与离线安装手册
  • vscode中设置eslint保存时自动格式化未生效
  • 网易爆米花 1.8.8 | 免费无广告,支持多网盘聚合和智能刮削技术,提供顶级画质和逼真音效的影视管理应用
  • 【大模型系列篇】Qwen3开源全新一代大语言模型来了,深入思考,更快行动
  • Python 用一等函数重新审视“命令”设计模式
  • CMake解析参数用法示例