issues
search
kenttanl
/
kenttanl.github.io
个人博客,http://kentt.top/
https://kenttanl.github.io/
MIT License
0
stars
0
forks
source link
TCP
#3
Open
kenttanl
opened
3 years ago
kenttanl
commented
3 years ago
定义
TCP 是一个面向有连接的、可靠的通信服务协议
连接
为什么需要三次握手
:
为了实现可靠的数据传输,TCP 协议的通信双方都必须维护一个序列号(Sequence number),以标识已经发送出去的数据包中,哪些是已经被对方收到的。所以三次握手的过程是通信双方相互告知与确认序列号起始值的必经步骤。如果只是两次握手,则至多只有连接发起方的其实序列号能够被确认;
为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误;
为什么序列号不从 0 开始
:
预防 TCP 序列预测攻击,参考:
https://en.wikipedia.org/wiki/TCP_sequence_prediction_attack
;
尽可能的避免数据混淆(2msl可以解决);
为什么需要四次挥手
:TCP 是全双工通讯协议,关闭连接时,服务器端收到对方的 FIN 报文,仅代表对方不在发送数据了,但是还是能够接受数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
数据的发送
保证可靠性传输的机制
:通过校验和(Checksum)、序列号(Seq)、确认应答(Ack)、重发控制、连接管理、窗口控制等机制实现可靠性传输;
单位
:TCP 以段为单位发送数据,每段消息的最大长度被称为 MSS(Maximum Segment Size),MSS 是在三次握手通过双方协商而成(选择两者中相对更小的值);
可靠性
:数据的发送通过序列号与确认应答来提高其可靠性:如果发送端在一定的时间内没有等到确认应答,那么发送端会认为数据已经丢失,并进行重发。由此可以保证,即使产生了丢包,仍然能够将数据发送出去;
重发超时如何确定
:每次发包时都会计算往返时间及其偏差,将这个往返时间和偏差相加,重发超时时间就是比这个总和要稍微大一点的值;
滑动窗口控制
:通过窗口提高发送速,其类似于阻塞队列似的缓冲区,以使得发送数据时不必每次发送完消息都必须等待应答后才能继续发送下一次的消息。同时确认应答也不再是以每个分段,而是以更大的单位进行确认时,转发时间将会被大幅度的缩短。窗口的滑动是在收到确认应答后,将窗口滑动到确认应答中的序列号的位置。
窗口控制与重发控制
:发送端仅需要通过最后一次确认序列号来确定哪些消息发送成功了,而不必对所有没有收到确认应答的数据都进行重;
流控制
:
动态调整窗口大小
:接收端可以根据自己的实际接受能力动态的来向发送端告知自己可以接受数据的大小,发送端收到后,发送的数据不会超过这个大小;
窗口探测
:为了避免缓冲区满了之后,无法继续发送数据的同时更新窗口大小的通知被丢失,此时发送端会时不时的发送一个叫做窗口探测的数据段,此数据仅包含一个字节以获取最新的窗口大小信息。
拥塞控制
:
慢启动
:即初始窗口(拥塞窗口)大小为1MSS,然后的大小每收到一次确认应答就增加1,最终发送端能够发送的数据是接收端通知的窗口大小与拥塞窗口的大小中较小值还要小的值;
慢启动阈值
:如果拥塞窗口的值超出这个阈值,在每收到一次确认应答时,只允许以下面这种比例方法拥塞窗口:1个数据段的字节数 / 拥塞窗口(字节) * 1个数据段字节数
提高网络利用率的一些规范
:
Nagle 算法
:如果发送端还有应该发送的数据,但是这部分数据很少的话,则进行延迟发送的一种处理机制;
延迟确认应答
:接收端收到数据以后,并不立即返回确认应答,而是延迟一段时间,从而减少应答数量;
捎带应答
:确认应答和回执数据通过一个包发送的方式,即回执数据时捎带了一个应答。这样可以减少包的发送次数;
附录1:TCP 状态变更图
定义
TCP 是一个面向有连接的、可靠的通信服务协议
连接
数据的发送
附录1:TCP 状态变更图