【Linux】TCP可靠传输的机制

在linux网络编程中面试官问到最多的问题也离不开TCP和UDP了,那么我也由于某个契机也被问到了这么一个问题,没有完全回答上来,或者说最主要的没有回答上来,在这里专门总结一下TCP可靠传输的机制

TCP可靠传输的机制

  1. TCP连接管理中的保活机制
  2. 确认应答机制
  3. 超时重传机制
  4. 协议字段中的序号/确认序号
  5. 协议字段中的校验和
  6. 面向连接(三次握手建立连接)(重点
  7. 滑动窗口机制(重点) —也可以说是TCP传输中提高传输性能的机制

TCP连接管理中的保活机制

TCP的服务端与客户端建立连接以后才可以通信,若通信双方长时间(7200s)无数据往来,则每隔一段时间(75s)向对端(服务端向客户端)发送一个保活探测数据包,要求对方进行相应的回复,若多次(9次)都没有得到响应,则认为连接断开。

注意

  1. 向对端大多情况下是服务端向客户端发送保活探测数据包
  2. 这些数据都可以自己进行设置

连接断开在程序中的体现主要体现在两个方面

  1. recv返回0
  2. send触发SIGPIPE异常

设置套接字选项:

int setsockopt (int fd, int level, int name, void* option, int optlen)
fd: 套接字描述符
level:SOL_SOCKET 
name:SO_REUSEADDR 地址重用
SO_KEEPALIVE 开启保活机制选项

确认应答机制

发送一条数据,如果到达对端,对端给发送方一条回复,表示数据已经接收到了

超时重传机制

若超过一段时间,发送端没有接收到对端的接收数据完毕的回复,则认为数据丢失,就会重新传达相同的数据

总结:确认应答机制和超时重传机制都是保证数据安全到达对端的重要措施,但是并不保证有序到达

TCP协议字段中的序号/确认序号

  1. 有了TCP协议字段中的序号和确认序号以后,就可以在接收缓冲区中进行包序管理,发送的数据都有序号,发送的数据在对端的缓冲区中也会根据序号进行排序。 使数据有序到达

  2. 确认序号一定是保证在这个序号之前的数据都已经收到了。(第一条数据没有收到,就算收到了第二条数据,也不会对第二条数据进行确认回复,因为每一条回复都要保证在这之前的数据都已经完全收到)

协议字段中的校验和

TCP的头部信息中心有一个16位的校验和。如果不一致的话,丢掉重传(二进制反码求和)。

面向连接

TCP的面向连接的特性一定程度上决定了TCP的可靠传输。**因为TCP通信前得三次握手建立连接,确保客户端、服务端双方都在线且都有数据收发能力的时候,才进行数据的传输。**所以面向连接这个特性也能算上是TCP可靠传输的机制

滑动窗口机制

为什么要使用滑动串口来进行TCP数据的传输呢?
1.避免丢包。 丢包以后,数据要进行重传,降低效率。
2.提高性能。如果每一次对端收到数据,就要给一个回复的话,性能有所下降。

实现流程
通过一个窗口的后沿(保存序号的变量)和一个窗口的前沿(保存序号的变量)以及一个当前发送序号。通过这几个序号就可以维护一个滑动窗口

在tcp三次握手的阶段,通信双方会协商一个数据–最大数据段(报文段)的大小—MSS
用户send发送数据会将数据放到发送缓冲区中,然后操作系统会从缓冲区中每次取出不大于MSS大小的数据,封装TCP头部发送出去
TCP在每次发送数据的时候,都会给对方报文头部中发送一个字段 16位窗口大小 -----用户暂时告诉对方一次最多给自己连续发送多少数据

双方进行通信,令发送数据的一方为A, 接收数据的一方为B
B在报文头部会发送A一个字段,告诉A,B的16位窗口的大小。但是B的这个窗口的大小不大于接收缓冲区中剩余空间的大小。

滑动窗口机制的好处

  1. 发送发可以连续发送多条数据,等待对方回复,提高传输性能
  2. 持续发送数据,连续接收确认回复,可以避免因为确认回复(ACK)丢失而导致数据重传。(因为每一条数据都有确认序号,都要保证在这之前的数据都已经安全达到。也就是说收到第二条确认回复但是没有收到第一条回复信息,也能说明第一条与第二条数据都收到了,不用再重新传了)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值