文章目录
一、TCP协议简介
TCP协议是有连接的,面向字节流的传输层协议。主要实现端到端的数据传输,保证可靠,信息准确无误
TCP首部格式

这里数据偏移也可以定义为TCP首部的长度,控制位包括8位控制标识 如图

- ACK:为1时,表示确认应答的字段生效
- SYN:为1时,表示希望建立连接,并且可以设置序列号
- FIN:为1时,表示希望断开连接
二、TCP三次握手,四次挥手
1.三次握手

- 客户端将TCP首部控制位的SYN设为1,并将序号seq=x发送,此时客户端进入SYN_SEND
- 服务端接收到后,将控制位SYN和ACK都设为1, 并将确认应答号ack=x+1,序号seq=y发送,此时服务端进入SYN_RECV
- 客户端接收到后,将控制位SYN设为1,并将确认应答ack=y+1发送,此时客户端进入ESTABLISHED,随后服务端接收到后,也进入ESTABLISHED,就可以通信了。
黏包问题
2.四次挥手

- 客户端向服务端发送控制位FIN为1报文段,并设置序列号seq=x,此时客户端进入FIN_WAIT_1。
- 服务端接收到后,向客户端返回一个标志位ACK为1的报文段,设置ack=x+1,此时服务端进入CLOSE_WAIT。客户端接收到后进入FIN_WAIT_2。
- 服务端向客户端发送FIN为1的报文段,并设置seq=y发送,此时服务端进入LAST_ACK。
- 客户端向服务端发送ACK为1的报文段,并设置ack=y+1,此时客户端进入TIME_WAIT,服务端收到后进入CLOSED,随后客户端等待2MSL的时间后,也进入CLOSED。
3.为什么是四次挥手不是三次?
因为TCP协议是全双工模式,两端都可以发送和接收数据,第二次挥手服务端接收到FIN,说明客户端已经没有信息再发来,所以需要回复ACK确认,但不代表服务端信息发送结束,所以要等服务端发送完数据才能给客户端发送FIN,而不能同时发送。
三、TCP协议的机制
1.确认应答机制

通过报文首部的序列号和确认应答号来实现,确认应答表示上一条数据已经成功接收到,确保的TCP的可靠性。
发送时:携带序列号
确认回复时:携带应答确认号
2.超时重传机制


如果发送方在一定时间内没有收到回应,有以上两种情况,发送方就认定丢包,就会触发重发机制。
重发超时时间如何确定?
TCP要求无论在何种网络环境下都要提供高性能通信,为此,在每次发包时都会计算往返时间及其偏差,重发超时时间就是比两者相加稍大一些的值。
如果重发的数据仍没有回复,等待的时间将会以2倍,4倍这样指数型增长。
如果达到一定重发次数之后,会判断为网络或对端主机发生了异常,强制关闭连接。
3.连接管理机制
TCP面向有链接的通信传输,通信之前需要建立连接,之后需要断开连接,也就是上面的三次握手和四次挥手。
4.滑动窗口机制
TCP协议以段为单位发送数据包,每发一个段就确认相应一次,
这样的缺点是往返时间过长的时候,通信性能很差。

所以就有了窗口的概念,如图窗口的大小就是4个段。

- 窗口大小:无需等待确认应答而可以继续发送数据的最大值,上图窗口大小为4个段。窗口大小由拥塞窗口和流量控制窗口决定,取较小值。
- 发送前4个段的时候,不需要等待ACK,直接发送。当收到第1个段的ACK后,窗口可以向后滑动,然后就可以发送第5个段,以此类推。
- 操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还没有应答的数据,只有确定应答过的数据,才能从缓冲区删掉。同样有接收缓冲区,来记录接收到的数据序号,来防止对端没有接收到ACK。
- 窗口越大,则网络的吞吐率就越高
可能出现断丢失的情况和处理方法
- 当前面的应答确认都丢失,可以根据之后的应答来确认。这种情况不会重发。

- 当接收方没有收到第n个段,之后会连续重复三次同样的确认应答,直到发送方发送正确的段,但下面的2001-7000序号会保存到接收缓冲区,所以等到1001-2000段接收到后,可以直接发送ack=8001。

5.流量控制机制
实际通信过程中,发送方发送一个数据包,接收方可能在处理其他事情需要花时间,或者正是高负荷,接收缓存区已满等情况,会将本该接收的数据包丢弃。导致触发重发,也就是发送方没有考虑接收方的接收能力,这样显然不行。所以就有了流量控制。
流量控制窗口:作用是发送段根据接收端的指示,对发送的数据量进行控制。基于TCP报文首部中窗口大小字段来设置。
图中的滑动窗口只有流量控制窗口影响,但实际还受到阻塞程度影响。

6.拥塞控制机制
当对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做堵塞。堵塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至过载。
TCP进行拥堵控制的算法有四种:慢开始,拥塞避免,快重传,快恢复。
- 慢开始:当主机开始发送数据时,由于并不清楚网络的符合情况,所以较好的方法是先探测一下,由小到大逐渐增大发送窗口,既逐渐增大拥塞窗口数值,大致如图,每经过一个传输轮次,拥塞窗口cwnd就加倍:

- 拥塞避免:让拥塞窗口cwnd缓慢的增大,每一个往返加1,这样线性增长。
- 快重传:要去要接收方不要等待自己发送数据时才捎带确认,而是要立即发送确认,就算收到了失序的报文段也要立即对已经收到的报文段进行反复确认,也就是上面的滑动窗口中应用到的。这样做的效果就是不会让发送方认为丢包是因为网络阻塞。
- 快恢复:当如图发送方直到现在只是丢失了个别报文段,于是执行快恢复算法,也就是适当把拥堵窗口扩大些,这么做的理由是,发送方收到了连续三个重复的确认,说明发出去的至少三个报文段在接收方的接收缓存区中,所以应该适当将窗口扩大一点。

7.延迟应答机制
接收端接收到数据,立刻相应ack,流量控制窗口的大小可能会比较小,如果稍微等一会,让接收端程序接收缓冲区数据再返回ack,可以有效的提高效率。
- 在没有收到2*最大段长度的数据为止不做确认应答(根据操作系统的不同,有时也会不论数据大小,只要收到两个包就即可返回确认应答的情况。)
- 其他情况下,最大延迟0.5秒发送确认应答,
8.捎带应答机制
接收端回应ack,可以和主动发送的数据一起发送。
目的就是提高网络利用率,从而降低计算机处理负荷。
9.Nagle算法
TCP为了提高网络利用率,会使用Nagle算法。作为一种延迟发送的处理机制。
当发送端发送端要发送的数据很少时,如果这两个条件满足:以发送的数据都已经收到确认应答 可与发送最大段长度(MSS)的数据时,就会暂缓一段时间才进行数据发送。
四、常见问题
1.TCP如何实现可靠性?
- 校验和
- 序列号
- 确认应答
- 超时重发
- 连接管理
- 流量控制
- 拥塞控制
校验和:用来判断协议首部或者数据是否被破坏。
2.TCP和UDP的区别?
- TCP是有连接的;UDP没有连接。
- TCP连接端到端只有两个端点;而UDP支持一对一,一对多,多对多。
- TCP提供可靠的传输服务,保证数据无差错,不丢失,不重复,按序送达;UDP尽可能的传输,不保证可靠。
- TCP面向字节流;UDP面向报文,既不合并,也不拆分。
- TCP提供全双工通信,通信双方都可以发送接收数据。
- UDP没有阻塞控制。
- UDP首部的开销小,只有8个字节,TCP有20个字节。
3.黏包问题?
1.出现原因
因为TCP是基于字节流,一次连接中,发送多组数据,前一组的尾部和后一组的头部没有区分开就会造成黏包,是因为TCP协议自己造成的。情况很多:
- 如果发送方发送多组数据,且数据量很少,TCP为了保证传输效率,会先把连续发送的少量数据合成后一起发送出去,这样接受方收到的数据就出现黏包问题。
- 如果接受方的缓冲区内的数据尚未取走,这时发送方由发来数据。再取的话就会出现黏包问题。
2.解决方法
- 将数据的长度和数据一起发送。
- 明确每个数据包的边界,用特殊标记来区分数据包的边界。
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。


4692

被折叠的 条评论
为什么被折叠?



