Linux C学习路线全概括及知识点笔记3-网络编程

发布于:2025-06-12 ⋅ 阅读:(56) ⋅ 点赞:(0)

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

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_INET6

type:套接字类型,如 SOCK_STREAM(TCP),SOCK_DGRAM(UDP)

protocol:通常设为 0(自动选择),或指定 IPPROTO_TCP / IPPROTO_UDP

2. int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
作用:将 socket 绑定到本地地址(IP + 端口)

参数:

sockfd:由 socket() 返回的描述符

addr:本地地址结构体指针,如 struct sockaddr_in

addrlen:地址结构体的长度(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_

网站公告

今日签到

点亮在社区的每一天
去签到