计算机网络

一、网络基础概念

1.1 网络拓扑与设备

现代计算机网络通过有线或无线介质连接各种设备,常见的拓扑结构包括:

  • 星型拓扑:以中心节点为核心,常见于局域网
  • 总线型:多个局域网通过主干线连接
  • 环形:节点形成闭合环,多用于城域网
  • 复合型:实际网络中的混合结构

1.2 网络寻址体系

IPv4地址传统分类:

类别范围网络/主机位最大主机数
A1.0.0.0-126.255.255.2557/2416,777,214
B128.0.0.0-191.255.255.25514/1665,534
C192.0.0.0-223.255.255.25521/825Socket编程

二、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三次握手与四次挥手

三次握手过程

  1. 客户端发送SYN=1, seq=x

  2. 服务器回应SYN=1, ACK=1, seq=y, ack=x+1

  3. 客户端发送ACK=1, seq=x+1, ack=y+1

四次挥手过程

  1. 主动方发送FIN=1, seq=u

  2. 被动方回应ACK=1, ack=u+1

  3. 被动方发送FIN=1, seq=v

  4. 主动方回应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)、路由协议

  • 容忍数据丢失:传感器数据采集、日志上报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值