一、网络基础概念
1.1 网络拓扑与设备
现代计算机网络通过有线或无线介质连接各种设备,常见的拓扑结构包括:
- 星型拓扑:以中心节点为核心,常见于局域网
- 总线型:多个局域网通过主干线连接
- 环形:节点形成闭合环,多用于城域网
- 复合型:实际网络中的混合结构
1.2 网络寻址体系
IPv4地址传统分类:
| 类别 | 范围 | 网络/主机位 | 最大主机数 |
|---|---|---|---|
| A | 1.0.0.0-126.255.255.255 | 7/24 | 16,777,214 |
| B | 128.0.0.0-191.255.255.255 | 14/16 | 65,534 |
| C | 192.0.0.0-223.255.255.255 | 21/8 | 25Socket编程 |
二、Socket编程
1. 大端对齐/大端序/网络字节序
定义:大端序(Big-Endian)是指将数据的最高有效字节(MSB,Most Significant Byte)存储在最低的内存地址处,
而将数据的最低有效字节(LSB,Least Significant Byte)存储在最高的内存地址处。
0x1234
内存低地址:0x12
内存高地址:0x34
地址:0x1000 0x1001 0x1002 0x1003
数据: 12 34 56 78
- power(IBM)、solaris(Oracle)、传统的UNIX服务器
- 网络通信使用
2. 小端对齐/小端序/本地字节序
定义:小端序(Little-Endian)是指将数据的最低有效字节(LSB,Least Significant Byte)存储在最低的内存地址处,
而将数据的最高有效字节(MSB,Most Significant Byte)存储在最高的内存地址处。
0x1234
内存低地址:0x34
内存高地址:0x12
地址:0x1000 0x1001 0x1002 0x1003
数据: 78 56 34 12
- x86、intel、AMD 使用小段对齐
- 嵌入式芯片、传感器
- 效率高
2.1 TCP
服务器端
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
// 创建socket文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定socket到端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 读取客户端数据
read(new_socket, buffer, BUFFER_SIZE);
printf("Message from client: %s\n", buffer);
// 发送响应
char *hello = "Hello from server";
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
close(new_socket);
close(server_fd);
return 0;
}
客户端
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char *hello = "Hello from client";
char buffer[1024] = {0};
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 转换IP地址为二进制形式
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
printf("\nInvalid address/ Address not supported \n");
return -1;
}
// 连接服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
// 发送数据
send(sock, hello, strlen(hello), 0);
printf("Hello message sent\n");
// 读取响应
read(sock, buffer, 1024);
printf("Server: %s\n", buffer);
close(sock);
return 0;
}
三、关键网络机制
3.1 TCP三次握手与四次挥手
三次握手过程:
-
客户端发送SYN=1, seq=x
-
服务器回应SYN=1, ACK=1, seq=y, ack=x+1
-
客户端发送ACK=1, seq=x+1, ack=y+1
四次挥手过程:
-
主动方发送FIN=1, seq=u
-
被动方回应ACK=1, ack=u+1
-
被动方发送FIN=1, seq=v
-
主动方回应ACK=1, ack=v+1
3.2 UDP
// UDP服务器示例
#include <sys/socket.h>
#include <netinet/in.h>
#define UDP_PORT 9090
int main() {
int sockfd;
char buffer[1024];
struct sockaddr_in servaddr, cliaddr;
// 创建UDP socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(UDP_PORT);
// 绑定socket
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
socklen_t len;
int n;
len = sizeof(cliaddr);
while (1) {
n = recvfrom(sockfd, (char *)buffer, 1024, MSG_WAITALL,
(struct sockaddr *)&cliaddr, &len);
buffer[n] = '\0';
printf("Client : %s\n", buffer);
sendto(sockfd, "UDP Response", strlen("UDP Response"),
MSG_CONFIRM, (const struct sockaddr *)&cliaddr, len);
}
return 0;
}
四、TCP与UDP协议核心特性对比总结
-
TCP:面向连接的可靠传输协议,建立正式通信管道
-
UDP:无连接的简单数据报协议,直接发送数据包
| 特性维度 | TCP协议特点 | UDP协议特点 |
|---|---|---|
| 连接管理 | 需要三次握手建立连接,四次挥手释放连接 | 无需建立连接,直接发送数据包 |
| 可靠性 | 通过确认应答(ACK)、超时重传、数据排序等机制确保可靠传输 | 不保证数据到达,可能丢失或乱序 |
| 流量控制 | 采用滑动窗口机制动态调整发送速率 | 无内置流量控制,发送速率完全由应用层决定 |
| 拥塞控制 | 实现慢启动、拥塞避免、快速重传等算法 | 无拥塞控制机制,可能加剧网络拥塞 |
| 传输效率 | 较低(20-60字节头部开销,复杂的控制机制) | 较高(固定8字节头部,无额外控制开销) |
| 延迟表现 | 较高(需要建立连接、确认和重传过程) | 极低(无需握手和确认过程) |
| 数据完整性 | 通过校验和确保正确性,错误数据会重传 | 校验和检测错误但直接丢弃错误包,不重传 |
| 通信模式 | 全双工双向同时传输 | 支持单播、多播和广播 |
1. TCP适用场景
-
需要可靠传输:HTTP/HTTPS网页浏览、FTP文件传输
-
数据完整性优先:SSH远程登录、电子邮件(SMTP/POP3)
-
长时间连接:数据库连接、远程桌面
2. UDP适用场景
-
实时性要求高:视频流、语音通话(VoIP)、在线游戏
-
简单查询响应:DNS查询、DHCP分配IP
-
广播/多播应用:网络时间协议(NTP)、路由协议
-
容忍数据丢失:传感器数据采集、日志上报
2万+

被折叠的 条评论
为什么被折叠?



