简谈TCP的八个特性

TCP

1.确认应答ACK机制(可靠核心机制)

需要具体知道序号和确认序号的含义, 每个字节的内容都有序号, 比如发送方发送了1~1000, 1001~2000, 的两段数据, 但是1001开始的数据丢了, 那么接收方就会发送一个ACK确认报文, 其中的确认序号就1001, 代表我前面的1到1000的数据收到了, 下次需要你从1001开始发送, 这样发送方就知道了, 1001~2000丢了, 需要重传

2. 超时重传机制(可靠核心机制)

超时时间的重传, 当我们重传之后数据报可能会被接收方收到多次, 那么如何将其去重呢,就要用到上面的序号了, 序号相同的我只保留一份即可**(因为发送方是无法区分是数据报丢了, 还是确认的ACK丢了)**

3. 连接管理(面试必考)

  • 建立连接 三次握手的过程
  • 断开连接 四次挥手的过程

三次握手来确认通信双方的发送和接收能力是否正常

a) 第一次,a给b发送了一句喂喂喂你能听见吗? b如果接收到了这句话, 就证明b现在已经知道了a的发送能力和b的接收能力是正常的, 现在需要验证自己的发送能力和a的接收能力, 并将自己知道的也发送给对方

b)第二次, b就给a 发送了一个我能听见, 你可以听见我吗? 这样的话 如果a接收到了b 的这条信息, 那么就证明a刚刚验证自己的发送和b的接收是正常的, 同时a自己知道了b的发送能力 和 a自己的接收能力是好的, 此时a就是知道了双方的发送和接收是正常的,但是此时b是正在验证自己的发送能力和a 的接收能力是不是好的, 所以我们还需要a再次发送给b一条消息来告知是好的

c)第三次, a给b说一句我能听到, 此时b收到了消息, 那么就证明b上面验证自己的发送能力和a的接收能力是好的, 此时通信双方就都知道了双方的发送和接收能力是好的, 就可以发送正文了

四次挥手来断开双方连接

img

a) 首先是数据传输阶段, 通信双方正常传输数据

b) 当客户端数据发送完毕时, 应用层调用close()方法,客户端会发送一个FIN = 1其序列号为seq=m(等于前面已经传送过来的数据的最后一个字节的序号加1)的数据报, 此时客户端进入FIN_WAIT_1阶段

c) 当服务端,一收到了客户端传来的FIN报文段,操作系统内核就立马会发送一个ACK确认报文, 此时服务端进入CLOSE_WAIT状态, 半关闭状态此时客户端就没有数据要发送了, 但是客户端还会接收服务端传输过来的数据, 服务端之前还有客户端发送来的数据存在缓冲区需要处理,所以需要等待处理完之后才会调用close()方法来发送一个FIN报文, 服务端发送完FIN之后就会立马进入LAST_ACK状态

d) 一当上面的客户端收到了来自服务端的ACK报文就会立马进入FIN_WAIT_2阶段, 在这阶段一直等待服务端的FIN报文, 当客户端收到了FIN报文段就会进入TIME_WAIT状态, 并发送ACK确认报文段给服务端

e) 当服务端在最后收到了来自客户端的ACK报文, 那么就会立马进入CLOSED状态断开连接了

f) 但此时客户端还不会立马进入CLOSED状态, 因为最后的ACK报文段可能丢失, 所以需要等待2*MSL时间来, 确保数据丢失的情况下来超时重传

g) 为什么这个时间是 2*MSL呢?

​ 我们假设FIN/ ACK 报文在网络上由客户端传输到服务端需要花费的最大时间为MSL(就是取个名字), 举个例子 比如 : 我客户端发送了ACK确认报文, 但他在中途丢了, 那么是不是服务端就一直没有收到ACK确认报文, 那么他就会重传 FIN结束报文, 但此时要是我客户端直接发送完ACK后直接关闭了, 那么就无法响应服务器的二次请求,这样服务器会继续发出FIN报文,从而变成了死循环。所以我们要设置一个时间段 : 如果在这个时间段内接收到了服务器端的再次请求,则代表客户端发出的ACK报文没有接收成功。反之,则代表服务器端成功接收响应报文,客户端进入CLOSED状态,此次连接成功关闭。而这个时间,就规定为了2MSL,即客户端发出ACK报文到服务器端的最大时间 + 服务器没有接收到ACK报文再次发出FIN的最大时间 = 2MSL

4.滑动窗口(结合确认序号来理解)

是一种用来提高传输效率的机制, 批量的发送数据, 批量的等待ACK

不等待ACK所发送的最大数据量, 就称为滑动窗口

每收到一个ACK, 就对应的发后面的数据, 等待窗口的范围一直在往后移

5.流量控制

在滑动窗口的机制上, 限制传输的效率(就是限制窗口的大小)

接收方的接收缓冲区的空余大小,反向反馈发送者的滑动窗口大小

ACK报文的报头中, 有一个"窗口大小"字段, 这个字段就是接收方的接收缓冲区的空余空间大小

发送者也会定时的发送探测报文, 试探接收方的缓冲区的空余空间

6.拥塞控制

也是限制传输效率, 根据网络当前的拥堵情况, 动态决定实际传输的窗口大小

实际发送方的窗口大小 = min(拥塞窗口大小, 流量控制窗口大小)

7.延迟应答

目的是为了提高效率, 在流量控制的基础上, 尽量返回一个合理的但是又比较大的窗口

其实就是让ACK的发送时间晚一点(在不影响可靠性的前提下)

延迟的时间中就会给应用程序提供更多的消费数据的机会 ~~ 此时时间到了, 我再发送ACK, 得到的缓冲区大小就会比刚刚大一些

不是所有的包都可以延迟应答, 有数量限制和时间限制

8. 捎带应答

在延迟应答的基础上, 为了进一步提高程序运行效率而引进的机制

请添加图片描述

本质上就是把两个包,合并成为一个就是捎带, 节省带宽

9. 心跳机制

心跳包 就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。 用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经离线。 用于检测TCP的异常断开。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gopher333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值