网络编程

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的行为

  1. 默认0 做接收
  2. MSG_PEEK:窥视数据,返回数据值,但是不会将数据从接收缓冲区移除,以便下一次查看
  3. MSG_OOB:接收带外数据,是一种优先于普通数据传输的紧急数据,用于发送通知
  4. 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字节,协议开销小

        无需维护连接状态,可以同时处理多个客户端

应用场景

  1. 实时通信:视频、语音通话(允许少量数据丢失,但延迟低)
  2. 流媒体传输:直播(流畅性,不保证完整性)
  3. 游戏数据传输(对延迟敏感,轻微丢包)

一些函数

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尽量保证一次把数据接受完

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐