学习嵌入式的第三十天-数据结构-(2025.7.21)网络编程

发布于:2025-07-28 ⋅ 阅读:(16) ⋅ 点赞:(0)

这是几天内容的整合,主要是网络编程语言的学习内容。

OSI 模型与 TCP/IP 模型对比

OSI 模型(7层)

  • 应用层:提供网络服务(如电子邮件、文件传输)。
  • 表示层:数据加密解密、压缩(如 gzip)。
  • 会话层:管理连接状态(如 keep-alive、断开重连)。
  • 传输层:提供可靠(TCP)或不可靠(UDP)传输。
  • 网络层:路由选择、IP 地址管理(如 NAT)。
  • 数据链路层:数据帧封装、物理地址寻址(如交换机)。
  • 物理层:电信号传输(如电缆、无线信道)。

TCP/IP 模型(4层)

  • 应用层:HTTP、FTP、DNS 等协议。
  • 传输层:TCP(可靠)、UDP(不可靠)。
  • 网络层:IP、ICMP(ping)、RIP 等。
  • 接口层:ARP(IP 转 MAC)、RARP。

IP 地址分类

A 类地址

  • 范围:1.0.0.0 - 126.255.255.255
  • 私有地址:10.0.0.0 - 10.255.255.255
  • 子网掩码:255.0.0.0

B 类地址

  • 范围:128.0.0.0 - 191.255.255.255
  • 私有地址:172.16.0.0 - 172.31.255.255
  • 子网掩码:255.255.0.0

C 类地址

  • 范围:192.0.0.0 - 223.255.255.255
  • 私有地址:192.168.0.0 - 192.168.255.255
  • 子网掩码:255.255.255.0
  • 主机数:254(去除网关和广播地址)

D 类地址

  • 范围:224.0.0.0 - 239.255.255.255(组播/广播)

E 类地址

  • 范围:240.0.0.0 - 255.255.255.255(实验用途)

TCP 编程基础

网络配置(Linux)

  • 设置 IP 地址:
    ifconfig eth0 192.168.0.13/24 up
    

  • 设置网关:
    route add default gw 192.168.0.1
    

  • 设置 DNS:
    echo "nameserver 8.8.8.8" > /etc/resolv.conf
    

Socket 编程核心

  • TCP 服务端流程
    socket()bind()listen()accept()recv()/send()close()
  • TCP 客户端流程
    socket()connect()send()/recv()close()

UDP 编程特性

特点

  • 无连接、不可靠(可能丢包)、支持一对多(组播/广播)。

框架

  • 服务端socket()bind()recvfrom()close()
  • 客户端socket()sendto()close()

关键函数

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, 
               const struct sockaddr *dest_addr, socklen_t addrlen);


TCP 与 UDP 对比

特性 TCP UDP
连接方式 面向连接(三次握手) 无连接
可靠性 可靠(应答、重传) 不可靠(可能丢包)
数据边界 流式(无边界,需处理黏包) 数据报(有边界)
适用场景 文件传输、网页浏览 视频、音频实时传输

三次握手与四次挥手

三次握手(建立连接)

  1. 客户端发送 SYN(同步序列号)。
  2. 服务端回复 SYN-ACK
  3. 客户端发送 ACK 确认。

四次挥手(断开连接)

  1. 客户端发送 FIN
  2. 服务端回复 ACK
  3. 服务端发送 FIN
  4. 客户端回复 ACK

C/S 与 B/S 架构区别

C/S B/S
专用客户端(如 App) 通用客户端(浏览器)
自定义协议 HTTP 协议
功能复杂,资源在本地 功能简单,资源在服务端

P2P 模式

  • 直接通信(如直播、下载工具),无中心服务器。

tcp服务器函数调用顺序


socket();打开网络设备获得文件描述符(套接字)listfd监听套接字,作用就是三次握手    
bind();给套接字设定ip(确定主机)+port(确定主机的进程pid)
listen();使监听套接字进入监听状态(可以被三次握手的状态)
accept();服务器和客户端进入三次握手阶段,并建立连接。并获得通信套接字(服务器和客户端后续进行通信,用的套接字)
recv();阻塞接收客户端的数据。0==ret代表对方断开连接,通信结束。-1代表错误。>0实际接收到的字节数
send();发送的数据发送过程中有可能阻塞。发送的快,把对方的缓冲区填满就阻塞。
close();当收到对方的断开请求,就断开与客户端的通信。    
客户端
socket();打开网络设备 获得文件描述符(套接字),通信套接字
connect();客户端主动连接服务器,触发三次握手。
send();发送的数据发送过程中有可能阻塞。发送的快,把对方的缓冲区填满就阻塞。
recv();    阻塞接收客户端的数据。0==ret代表对方断开连接,通信结束。-1代表错误。>0实际接收到的字节数
close();当客户端任务完成后,主动关闭套接字。触发四次挥手


网站公告

今日签到

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