TCP特点
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式。
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
为满足TCP协议的这些特点,TCP协议做了如下的规定:
①数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;
②到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
③超时重发:发送方在发送分片时启动超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片;
④滑动窗口:
- 描述本端的缓冲区实际剩余空间大小(实时)。
- 防止对端多次发送数据导致存储空间溢出。
- ACK 回执,可以采用 “批量回执”。提高通信效率。
⑤失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
⑥重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
⑦数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验和有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发。
TCP中CS架构
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下:
建立连接(三次握手)的过程:
- 主动建立连接请求端(client), 发送 SYN 标志位,携带 序号。
- 被动建立连接请求端(server), 接收 SYN,回发 ACK,携带确认序号。发送 SYN,携带序号。
- 主动建立连接请求端(client), 接收 SYN,回发 ACK,携带确认序号。
四次挥手
- 主动关闭连接请求端(client),发 FIN 标志位,携带序号。
- 被动关闭连接请求端(server),接收 FIN标志位,发送 ACK应答。携带确认序号。—— 半关闭完成。
- 被动关闭连接请求端(server),发 FIN 标志位,携带序号。
- 主动关闭连接请求端(client),接收 FIN 标志位,发送 ACK应答。携带确认序号。—— 4次挥手完成。
TCP状态转换
相关操作函数
recv函数
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收数据
参数:
sockfd: 套接字描述符 socket的返回值或者accept返回值
buf: 接收数据缓存
len: buf的长度
flags: 接收数据的标志, 一般默认为0
返回值:
成功: 实际读到的数据的字节数, 如果对方已经关闭了 返回0表示读到结尾
失败: -1
send函数
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
发送数据
参数:
sockfd: 套接字描述符 socket的返回值或者accept返回值
buf: 发送的数据
len: 发送数据的长度
flags: 发送数据的标志 一般默认0
返回值:
成功: 非零值 实际上发送数据的字节数
失败: -1