Linux网络编程【TCP】

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值