Linux C学习路线全概括及知识点笔记3-网络编程
系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 系列文章目录
- 前言
- 一、pandas是什么?
- 二、使用步骤
- 1.引入库
- 2.读入数据
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
1,TCP/IP 协议分层结构总览(了解功能即可)
TCP/IP 模型共分为四层,从上到下依次为:
层级名称 | 主要协议 | 功能概要 |
---|---|---|
应用层 (Application Layer) | HTTP, FTP, DNS, SMTP 等 | 提供用户应用服务,定义应用数据的格式和交换规则 |
传输层 (Transport Layer) | TCP, UDP | 提供端到端的传输控制和错误校验,保证数据可靠或快速传输 |
网络层 (Internet Layer) | IP, ICMP, ARP | 实现跨网络通信,负责逻辑寻址和路由选择 |
网络接口层(或链路层) (Link Layer) | Ethernet, PPP, MAC等 | 管理物理连接,定义数据在本地网络中如何传输 |
1.1 各层功能详解
1.1.1 应用层(Application Layer)
功能职责:
(1)为用户提供网络应用服务
(2)定义应用数据的格式、编码、会话控制等
典型协议:
协议 | 功能说明 |
---|---|
HTTP | 网页浏览(超文本传输) |
FTP | 文件传输 |
SMTP | 邮件发送 |
POP3/IMAP | 邮件接收 |
DNS | 域名解析(将域名转换为IP地址) |
Telnet | 远程登录 |
PS:你在浏览器输入网址并回车,实际使用的是HTTP协议与服务器通信。
1.1.2 传输层(Transport Layer)
功能职责:
(1)端到端的通信控制
(2)建立/管理/终止连接
(3)数据分段、重组
(4)流量控制、差错检测与纠正
协议典型:
协议 | 特性 | 适用场景 |
---|---|---|
TCP | 面向连接、可靠、顺序、校验 | 网页、文件传输、邮件等 |
UDP | 无连接、不保证顺序或完整性 | 视频直播、DNS、语音等实时场景 |
PS:如果你下载文件,通常使用TCP;而如果在看直播,则往往用的是UDP。
1.1.3 网络层(Internet Layer)
功能职责:
(1)实现IP地址之间的通信
(2)路由寻址和转发
(3)分片与重组
典型协议:
协议 | 功能说明 |
---|---|
IP | 逻辑寻址与分包转发 |
ICMP | 网络错误/状态信息传递(如ping) |
ARP | 将 IP 地址解析为 MAC 地址 |
说明:
IP协议是核心,提供无连接的传输服务(不保证可靠性)
ICMP是网络层的“诊断助手”,如ping命令使用它
ARP在局域网中用于解决“IP->MAC”的问题
1.1.4 网络接口层(Link Layer)
又成链路层、主机到网络层(Host-to-Network Layer)
功能职责:
(1)实际的数据帧传输
(2)硬件地址识别(如MAC)
(3)帧校验、介质访问控制等
典型协议/技术:
技术或协议 | 功能说明 |
---|---|
Ethernet | 以太网,局域网最常用的链路协议 |
PPP | 点对点协议,多用于拨号接入 |
WLAN/Wi-Fi | 无线局域网 |
MAC 协议 | 媒体访问控制,控制谁可发数据 |
PS:数据包经过这一层,被封装成帧并在实际网线上(或无线)传输
1.2 整体数据传输过程示意
以一个网页请求为例(如访问 https://www.baidu.com):
(1)应用层(HTTP):构造网页请求
(2)传输层(TCP):将请求封装成可靠的数据段
(3)网络层(IP):决定如何将数据段送往目标服务器的IP地址
(4)链路层(以太网/Wi-Fi):将数据帧通过物理媒介发送出去
服务器响应时则逆向传输回来。
1.3 总结与记忆建议
层级 | 关键词 | 功能一句话记忆 |
---|---|---|
应用层 | 用户交互 | 用户与网络的接口(让程序会说话) |
传输层 | 端到端通信 | 保证数据“准时准量”到对方(握手或快传) |
网络层 | 寻址与路由 | 找到目的 IP 的路径(决定去哪儿) |
网络接口层 | 局域链路传输 | 数据如何走“最后一公里”(怎么走、给谁送) |
2,什么是Socket API?
Socket(套接字)是应用层与传输层之间通信的编程接口,本质上是一个通信端点。Socket编程允许我们在用户空间使用TCP或UDP协议,进行网络通信。
TCP/IP 协议栈中的 传输层(TCP/UDP)被Socket抽象为统一接口,因此不同协议的通信流程具有高度一致性,区别在于细节控制。
2.1 Socket 编程核心 API(UNIX/Linux平台)
下表是主要的 socket API 函数及其用途:
函数 | 说明 | 适用于 |
---|---|---|
socket() | 创建 socket 对象 | TCP/UDP |
bind() | 绑定本地地址和端口 | TCP/UDP |
listen() | 监听连接请求(TCP 专用) | TCP |
accept() | 接受连接请求,返回新的 socket(TCP) | TCP |
connect() | 主动连接服务器 | TCP |
send() /recv() | 发送和接收数据 | TCP |
sendto() /recvfrom() | 发送和接收数据(指定目标地址) | UDP |
close() | 关闭 socket | TCP/UDP |
2.2 TCP Socket 编程流程
TCP服务器端流程图:
TCP客户端流程图:
2.3 TCP示例代码
2.3.1 TCP服务端(C语言示例)
int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in sd = {0,};
sd.sin_family = AF_INET;
sd.sin_addr.s_addr = htnol(INADDR_ANY);
sd.sin_port = htons(12345);bind(sockfd, (struct sockaddr *)&sd, sizeof(sd));
listen(sockfd, 5);int connfd = accept(sockfd, NULL, NULL);
char buffer[1024] = {0};
recv(connfd, buffer, sizeof(buffer), 0);
send(connfd, "Hello from server", 17, 0);close(connfd);
close(sockfd);
2.3.2 TCP客户端(C语言示例)
int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in sd = {0, };
sd.sin_family = AF_INET;
sd.sin_port = htons(12345);inet_pton(AF_INET, "1237.0.0.1", &sd.sin_addr);connect(sockfd, (struct sockaddr *)&sd, sizeof(sd));send(sockfd, "Hello from client", 17, 0);
char buffer[1024] = {0, };
recv(sockfd, buffer, sizeof(buffer), 0);close(sockfd);
2.4 UDP socket编程流程
UDP服务器端流程:
UDP客户端流程:
2.5 UDP示例代码
2.5.1 UDP服务端
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in serd = {0, }, clid = {0, };
skcklen_t len = sizeof(clid);serd.sin_family = AF_INET;
serd.sin_addr.s_addr = htonl(INADDR_ANY);
serd.sin_port = hton(12345);bind(sockfd, (struct sockaddr *)&serd, sizeof(serd));char buffer[1024] = {0, };
recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&clid, &len);
sendto(sockfd, "UDP server reply", 16, 0, (struct sockaddr *)clid, &len);close(sockfd);
2.5.2 UDP客户端
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);structt sockaddr_in serd = {0, };
serd.sin_family = AF_INET;
serd.sin_prot = htons(12345);
inet_pton(AF_INET, "127.0.0.1", &serd.sin_addr);sendto(sockfd, "UDP client hello", 17, 0, (sturct sockaddr *)&serd, sizeof(serd));
char buffer[1024] = {0, };
recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);close(sockfd);
2.6 TCP vs UDP 对比表格
特性 | TCP | UDP |
---|---|---|
是否连接 | 有连接(可靠) | 无连接(不可靠) |
数据传输单位 | 字节流(stream) | 报文(datagram) |
是否保证顺序 | 是 | 否 |
是否保证可靠性 | 是(有确认、重传、流控、拥塞控制) | 否 |
适合场景 | 文件传输、网页、邮件等 | 实时语音、视频、DNS、NTP、广播等 |
2.7 Socket 编程核心函数原型与参数说明
1. int socket(int domain, int type, int protocol);
作用:创建一个套接字参数:domain:协议族,如 AF_INET(IPv4)或 AF_INET6type:套接字类型,如 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)protocol:通常设为 0(自动选择),或指定 IPPROTO_TCP / IPPROTO_UDP2. int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:将 socket 绑定到本地地址(IP + 端口)参数:sockfd:由 socket() 返回的描述符addr:本地地址结构体指针,如 struct sockaddr_inaddrlen:地址结构体的长度(sizeof(struct sockaddr_in))3. int listen(int sockfd, int backlog);
作用:监听指定 socket,使其成为被动连接等待状态(仅用于 TCP)参数:sockfd:由 socket() 返回的描述符backlog:等待连接队列的最大长度4. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
作用:从连接队列中取出一个连接(TCP 专用)参数:sockfd:监听 socket 的描述符addr:保存客户端地址信息的结构体指针addrlen:输入输出参数,指示地址结构体长度5. int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:客户端发起连接请求(TCP)参数:sockfd:由 socket() 返回的描述符addr:服务器地址结构体指针addrlen:地址结构体长度6. ssize_t send(int sockfd, const void *buf, size_t len, int flags);
作用:向已连接的 socket 发送数据(TCP)参数:sockfd:连接 socket 的描述符buf:指向发送数据的缓冲区len:缓冲区长度flags:通常为 0,可指定 MSG_