1. TCP传输控制协议概述
TCP(传输控制协议)是一种用于在网络中可靠传输数据的协议。它基于服务器客户端模型工作,常见的模型包括:
- CS(Client-Server)模型:客户端和服务器角色分明,客户端向服务器请求服务。
- BS(Browser-Server)模型:浏览器作为通用客户端,服务器提供服务。
- P2P(Peer-to-Peer)模型:节点之间对等通信,每个节点既是客户端又是服务器。
这些模型的区别如下:
- CS模型:使用专用客户端,应用层协议可自定义,功能相对复杂,资源(如数据)存储在本地。
- BS模型:使用通用客户端(浏览器),应用层协议固定为HTTP,功能相对简单,资源由服务器发送给客户端。
- P2P模型:常用于网络下载工具。例如,初始下载进度为0%时,其他客户端或服务器提供数据;当进度达90%时,自身也为新客户端上传数据,实现同时下载和上传。
2. TCP的主要特征:
- 有连接:通过三次握手建立连接,连接建立后保持直到一方断开(四次挥手)。
- 可靠传输:通过应答(ACK)、超时重传等机制确保数据完整。但实时性较弱,网络资源消耗较大。
- 流式套接字:数据无边界,连续有序。
- 全双工:支持双向通信,使用双缓存区。
- 发送与接收次数不匹配:发送次数和接收次数不需要对应。
- 写阻塞:存在64K的缓冲区限制。
- 感知断开:一方断开连接时,另一方可通过四次挥手感知。
可靠传输机制包括:
- 应答(ACK):确认数据接收。
- 超时重传:未收到应答时重发数据。
- 实时性弱:不适合高实时性应用。
- 资源消耗大:相比UDP,占用更多网络资源。
3. TCP相关函数详解
创建套接字:socket()
用于创建套接字描述符。
int socket(int domain, int type, int protocol);- 功能:向内核申请创建套接字描述符。
- 参数:
domain:地址族,如PF_INET(互联网程序)或PF_UNIX(单机程序)。type:套接字类型,如SOCK_STREAM(TCP流式套接字)、SOCK_DGRAM(UDP数据报套接字)、SOCK_RAW(原始套接字)。protocol:协议,设为0表示自动适应应用层协议。
- 返回值:成功返回套接字ID,失败返回-1。
绑定地址:bind()
用于服务器绑定地址。
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);- 功能:将套接字ID与指定地址关联,用于接收数据。
- 参数:
sockfd:套接字ID。my_addr:地址结构指针。addrlen:地址长度。
- 返回值:成功返回0,失败返回-1。
监听连接:listen()
用于服务器监听连接请求。
int listen(int sockfd, int backlog);- 功能:在套接字ID上监听连接。
- 参数:
sockfd:套接字ID。backlog:允许三次握手的排队数。
- 返回值:成功返回0,失败返回-1。
接受连接:accept()
用于服务器接受客户端连接。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);- 功能:从监听队列中取出有效客户端连接。
- 参数:
sockfd:套接字ID。addr:客户端地址结构指针,可设为NULL忽略地址信息。addrlen:地址长度指针,需设置为sizeof(struct sockaddr)。
- 返回值:成功返回新通信套接字ID,失败返回-1。
接收数据:recv()
用于接收数据。
ssize_t recv(int sockfd, void *buf, size_t len, int flags);- 功能:从套接字接收数据到缓冲区。
- 参数:
sockfd:通信套接字ID(服务器为accept()返回的ID,客户端为socket()返回的ID)。buf:存储数据的缓冲区。len:要接收的数据长度。flags:接收方式,0表示阻塞接收。
- 返回值:成功返回接收数据长度(≤len),失败返回-1。
发送数据:send()
用于发送数据。
int send(int sockfd, const void *msg, size_t len, int flags);- 功能:从缓冲区发送数据到套接字。
- 参数:
sockfd:通信套接字ID(同上)。msg:要发送的数据指针。len:要发送的数据长度。flags:发送方式。
- 返回值:成功返回发送数据长度,失败返回-1。
连接服务器:connect()
用于客户端连接服务器。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);- 功能:向目标主机发起连接请求。
- 参数:
sockfd:本地套接字ID。addr:目标主机地址结构指针。addrlen:地址长度。
- 返回值:成功返回0,失败返回-1。