网络,五层模型,七层模型,TCP协议,UDP协议
网络编程
tcp udp http io复用 select/poll/epoll libevent
网络要进行分层,进行解耦和标准化
OSI七层模型(理论模型)
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
1.应用层
功能
为应用程序提供接口服务,与用户直接交互
协议
HTTP/DNS
数据单位
数据(data)
2.表示层
功能
数据的格式化和转换
协议
JPEG
数据单位
数据(data)
3.会话层
功能
建立、管理、终止对话,负责在两个应用程序间同步
协议
SQL
数据单位
数据(data)
4.传输层
功能
提供端到端的可靠传输
协议
TCP/UDP
数据单位
段/数据报
5.网络层
功能
路径的选择和路由
协议
HTTP
数据单位
数据包
6.数据链路层
功能
在直接相连的设备中传输数据帧
协议
ETHERENT(以太网)
数据单位
帧
7.物理层
功能
定义物理介质和电器属性
协议
网线
数据单位
比特
TCP/IP五层模型(实际模型)
应用层、传输层、网络层、数据链路层、物理层
1.应用层
功能
为应用程序提供接口服务,与用户直接交互
协议
HTTP/DNS
数据单位
数据(data)
2.传输层
功能
提供端到端的可靠传输
协议
TCP/UDP
数据单位
段/数据报
3.网络层
功能
路径的选择和路由
协议
HTTP
数据单位
数据包
4.数据链路层
功能
在直接相连的设备中传输数据帧
协议
ETHERENT(以太网)
数据单位
帧
5.物理层
功能
定义物理介质和电器属性
协议
网线
数据单位
比特
网络连接的两个要素
网络设备、传输介质
IP地址作为唯一标识,端口号作为传输的窗口

TCP(传输控制协议),传输层协议
核心特点
1.面向连接:通过三次握手和四次挥手来建立和断开连接
2.可靠传输:①序号与确认,该协议会给每个字节编号,当接收方接收到后,期望通过ACK应答回复
②超时重传,超时后未收到ACK应答信号,会重新发送数据
3.面向字节流:不保留边界信息,将数据切为TCP段传输,接收方需要自行解析消息边界

相关函数
int socket (int domain , int type , int protocol )
创建套接字
domain:地址族,决定套接字的地址格式,IPV4还是IPV6
AF_INET: IPV4
AF_INET6: IPV6
type:定义套接字的通信传输方式
SOCK_STREAM:流式套接字,对应TCP协议
SOCK_DGRAM:数据报套接字,对应UDP协议
protocol:默认填0,会根据前两个参数,选择对应的通信协议
int bind (int socked , const struct sockaddr* addr , socklen_t addflen)
套接字与服务器绑定,绑定IP地址和端口号
sockfd:socket函数成功创建后返回的文件描述符(套接字)
addr:结构体中包含IP地址和端口号
struct sockaddr_in{
sa_familt_t sin_family//地址族
in_port_t sin_port//端口号
struct in_addr sin_addr//IP地址(网络字节序)
}
struct in_addr{
uint32_t s_addr;//ipv4地址(网络字节序)
}
主机字节序
x86架构 小端存储
网络字节序
大端存储
int listen(int sockfd, int backlog)
监听
sockfd:需要监听的套接字,该套接字由socket()创建,并绑定了IP地址和端口号
backlog:连接请求队列的最大长度

int accept(int socked, struct sockaddr* addr, socken_t *addrlen)
接收客户端的IP地址和端口号
sockfd:监听套接字
addr:指向结构体的指针,用于存放客户端的IP地址和端口号信息
addrlen:指向结构体大小的指针,采集客户端的结构体信息大小
返回值:但会一个新的套接字文件标识符,用来表示该次客户端连接时使用的套接字
ssize_t recv (int socked,void* buf,size_t len,int flags)
接收(从套接字接收数据到buf)
socked:填连接套接字
buf:指向接收缓冲区的指针
len:缓冲区大小
flags:控制参数,用于改变recv的行为
- 默认0 做接收
- MSG_PEEK:窥视数据,返回数据值,但是不会将数据从接收缓冲区移除,以便下一次查看
- MSG_OOB:接收带外数据,是一种优先于普通数据传输的紧急数据,用于发送通知
- MSG_WAITALL:知道接收到len长度的字节数据后才返回,但是不能保证数据完全接收完
返回值:成功返回接收到的字节数 失败返回-1,并将错误的原因设置给errno;特殊值0,表示连接已被关闭
ssize_t send(int socked,const void* buf,size_t len,int flags)
发送(向客户端发送)
socked:连接套接字
buf:发送缓冲区指针
len:发送的数据长度
flags:控制参数 默认0
返回值:成功返回实际发送的字节数;失败返回-1,并设置errno
int connect(int socked, const struct sockaddr* addr, socklen_t len)
sockfd:监听套接字
addr:存储服务器的IP地址和端口号
len:结构体大小
返回值:成功返回0;失败返回-1,设置errno
控制位(6个标志位)
用于管理tcp传输时的时态
URG:紧急指针有效,表示当前数据段有紧急数据
ACK:确认号有效,用于确认接收到的数据
PSH:要求接收方立即将数据传输给应用层,不保留缓冲数据
RST:重置连接
SYN:同步序号,用于建立TCP连接(三次握手第一步)
FIN:请求关闭连接,表示发送方没有数据需要发送了(四次挥手第一步)

TIME_WAIT场景
作用
1.确保被动关闭方收到最终的ACK
主动关闭方发送的最后一个ACK保温有可能丢失,被动关闭方若未收到ACK信号,主动方会从发FIN保温,2倍周期时间足够覆盖。ACK丢失->被动方重新发FIN->主动方确认回复ACK的整个周期,避免因被动方收不到ACK而持续发送FIN
2.避免旧数据的残留报文干扰新连接
网络中存在延迟报文,若主动关闭方立即释放端口并重新建立连接,旧报文的数据可能会误入新连接,导致数据混乱,2倍的最大段数周期能确保残留数据都已超时取消,去除干扰。

UDP(用户数据报协议)
特点
简单、快速、轻量,适用对实时性要求高,但是对数据不是很敏感的场景,允许少量数据丢失
核心特点
1.无连接
无需建立连接,只需要发送数据时指定发送的目标地址即可,减少了连接建立的维护,数据传输延迟低
2.不可靠
不保证数据一定到达目标,也不保证数据的完整性和顺序性
没有确认机制、重传机制,发送完即认为此次任务完成
3.面向数据报
数据以数据报的形式传输,每个数据报包含完整的源地址和目标地址
发送方和接受方的缓冲区大小不匹配时,可能会导致数据截断
4.轻量高效
头部数据仅需要8字节,协议开销小
无需维护连接状态,可以同时处理多个客户端
应用场景
- 实时通信:视频、语音通话(允许少量数据丢失,但延迟低)
- 流媒体传输:直播(流畅性,不保证完整性)
- 游戏数据传输(对延迟敏感,轻微丢包)

一些函数
ssize_t recvfrom(int sockfd, void* buf ,size_t len,int flags, struct sockaddr* ser_addr, socklen_t* addrlen)
ssize_t sendto(int sockfd, void* buf ,size_t len,int flags, struct sockaddr* ser_addr, socklen_t* addrlen)
返回值:实际接受的字节数和实际发送的字节数,如果返回-1,会设置errno并说明错误原因
TCP和UDP的对比
| TCP | UDP | |
| 连接性 | 三次握手,四次握手 | 无连接 |
| 可靠性 | 非常可靠(有确认,重传机制) | 不可靠(无确认机制) |
| 传输效率 | 低(头部数据大,且需要维护连接状态) | 高(需无维护,头部小) |
| 数据边界 | 无数据边界,可能需要拆分 | 保留数据包边界(一次发送一次接收) |
| 适用场景 | 可靠性优先 | 实时性优先 |
UDP和TCP可以共享同一IP下的同一端口号
UDP尽量保证一次把数据接受完
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)