这是几天内容的整合,主要是网络编程语言的学习内容。
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 |
---|---|---|
连接方式 | 面向连接(三次握手) | 无连接 |
可靠性 | 可靠(应答、重传) | 不可靠(可能丢包) |
数据边界 | 流式(无边界,需处理黏包) | 数据报(有边界) |
适用场景 | 文件传输、网页浏览 | 视频、音频实时传输 |
三次握手与四次挥手
三次握手(建立连接)
- 客户端发送
SYN
(同步序列号)。 - 服务端回复
SYN-ACK
。 - 客户端发送
ACK
确认。
四次挥手(断开连接)
- 客户端发送
FIN
。 - 服务端回复
ACK
。 - 服务端发送
FIN
。 - 客户端回复
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();当客户端任务完成后,主动关闭套接字。触发四次挥手