TCP详细知识
计算机网络
八股-局域网和广域网详解
局域网LAN是范围内网络通信,组件方式有:计算机之间通过网线直连,通过集线器相互连接,通过交换机相互连接,通过交换机和路由进行相互连接
广域网WAN,通过许多局域网组合起来,连接世界各地,通过路由将各个局域网连接起来进行网络通信
要在局域网和广域网之间进行数据的传递,需要知道自己的本地地址,目标地址,本地端口,目标端口,数据传输之间的协议
常用的网络通信协议是TCP/IP 五元组进行数据之间的传递:
- 源IP:源主机IP
- 源端口号:源主机发送数据对应进程占用的端口号
- 目标IP:目标主机IP
- 目标端口号:目标接收数据对应进程占用的端口号
- 协议号
八股-OSI七层模型和TCP/IP五层模型
七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
五层协议:应用层,传输层,网络层,数据链路层,物理层
八股-数据在网络之间传递的过程
首先应用层的数据通过端口发送,通过操作系统网络协议栈进行数据段的封装,传输层封装成TCP,UDP数据报,然后继续通过操作系统网络协议栈进行网络层的封装,添加IP地址头部信息,然后操作系统通过驱动程序将网络层的数据传递给网卡接口进行处理,网卡中通过NIC封装成数据数据帧,处理MAC地址等链路信息,然后通过将数据进行光/电信号的转换进行计算机间信息的传递
八股-UDP详解
UDP的特点:
无连接:不需要进行连接
不可靠传输:因为没有建立连接,无安全措施,发送失败后不会反馈信息
面向数据报:不会对数据进行分解,按照数据原样大小进行传输
缓冲区:UDP只有接收缓冲区,没有发送缓冲区,UDP直接将数据交由内核进行网络层的封装,他的接收缓冲区也无法保证UDP传输的顺序性
全双工:UDP的socket即能读也能写
16位UDP长度表明首部加上数据载荷一共的容量UDP的最大数据量为64KB,检验为采用的是CRC检验算法
CRC检验算法,循环冗余检验算法,将UDP数据中的每个字节进行累加,将累加结果保存在16位检验和中进行传递,接受方接收到数据之后将其中的字节重新加一边,与检验和中的数据进行比较,相等表示数据完整
根据协议格式详解TCP
4位首部长度:表示TCP头部有几个四位的字节
序号:发送方标明一串的字节的第一个字节
确认序号:确认机制回递给发送方的确认机制,表明下一个字节从哪个地方开始
保留位:用于后序拓展头部
标志位:URG(紧急指针是否有效),ACK(确认号是否有效),PSH(接收端立刻从缓冲区将数据读走),RST(要求重新建立连接),SYN(请求建立连接),FIN(通知对方自己要关闭连接了)
窗口大小:标定滑动窗口的大小
检验和:CRC校验进行头部和数据的校验
Socket详解
说到TCP和UDP就一定要说到Socket,他是一个套接字,我的理解就是他是TCP协议和UDP协议的具体实现接口,存在于传输层,将应用程序的数据使用Socket进行封装传递给操作系统进行传递,也可以通过Socket与服务端地址和端口建立连接进行数据传递,Socket可以理解为我们java中的缓冲流进行数据的传递
八股-TCP可靠性机制
TCP的可靠性传输主要是靠确认应答和超时重传来实现TCP的可靠性传输,
确认应答
当TCP发送方发送一个TCP报文后,接收方通过报文中的序号和字节长度计算出下一个TCP报文开始的字节长度,发送确认应答报文,告诉发送方当前成功接受,并说明下一个TCP报文的开始字节序号
超时重传
发送方一般在发送完成数据中会进行等待,等待接收方返回的确认ACK报文,但是有的时候会遇到发送方没有收到确认报文,这个时候为了维护数据的稳定就要进行重传,这个时候就要分两种情况
第一种情况: 发送方发送的数据接收方没有收到
这种情况当超过等待时间,就会进行重传
第二种情况: 发送发没有接收到ACK报文的数据
这种情况就要进行超时重传,但是重传之后在接收方需要进行数据去重
超时重传等待时间
在进行超时重传的过程中,时间间隔多久才会进行数据重传呢?现在有两种重传时间计算策略
第一种: 固定超时重传时间策略
超时时间以500ms为计量单位,第一次发送数据之后,进行超时等待,如果500ms没有反馈,就会进行数据重传,这个时候的等待时间就会变成500ms的2倍,超过时间再次进行数据重传,下一次等待时间为4倍的500ms,是2的指数倍时间进行递增,当达到一定的时间限制之后如果还是没有收到反馈,就会触发重置TCP数据报,标识位RST设置为1,发送TCP复位报文,重新连接,如果还是失败就会强制关闭连接
第二种: 动态计算超时重传时间策略RTO
通过RTT(从发送数据到收到ACK数据之后的反馈时间)通过TCP协议的时间算法动态的计算出超时等待时间RTO,如果第一次发送数据失败,RTO进行默认的超时时间初始化,一般是1~3秒
两种策略如何使用: 一般TCP在没有稳定连接的时候,使用第一种固定策略,一般TCP进行连接的时候使用,在稳定之后会切换到动态计算时间策略,提高效率,但是在释放连接的时候最后释放连接的超时等待时间是2MSL(MSL:系统自定的最大超时等待时间一般是2分钟)
数据去重
超时重传可能会造成数据重复,为什么需要进行数据去重:有的时候一些重复的数据可能会影响系统的数据,比如说购物接口,如果发送两次没有进行去重之后,就会访问两次,就会导致购物两次的状况发生
如何去重:首先找到重复的数据,通过序号找到重复的数据,在TCP内核中,给每个Socket对象都安排一个内存空间,成为接受缓冲区,相当于一个队列,通过序号找到重复的数据
八股-三次握手和四次挥手
三次握手和四次挥手是TCP协议建立连接和释放连接的过程,主要依靠可靠性机制进行
三次握手
第一次有客户端先向服务段发送建立连接请求SYN数据报,服务器端在接受到之后,向客户端发送确认报文和建立连接请求报文ACK+SYN报文,客户端收到之后,向客户端发送确认报文成功建立连接,在建立连接时候可能会发生第一次SYN报文丢失,超过超时时间之后重传即可,也有可能丢失ACK_SYN报文,重传之后服务端要进行数据去重
四次挥手
三次握手的发起人一定是客户端,四次挥手的发起人一般是客户端,第一次发送断开连接的FIN报文,服务端接收到之后会发送确认的ACK报文,服务端就会结束进行关闭连接的操作,操作完成之后向客户端发送关闭连接的FIN报文,客户端向服务端发送确认ACK报文三次挥手结束,释放连接
第一次发送ACK和收到FIN数据丢失后根据超时时间进行重传即可,第二次FIN丢失有服务器端进行超时重传,这个时候客户端并不会释放连接,会等待2MSL时间,确认时间内没有收到服务端的再次FIN报文,释放连接
为什么要三次挥手和四次握手
通过三次握手才能确定双方的接受数据和发送数据的能力是否正常,初始化序列号,为后边数据的传递做准备,防止旧的连接造成错误
四次挥手才能保证双方释放连接的操作正确,进行安全释放
八股-滑动窗口详解
TCP的可靠性保持最重要的就是确认应答,没法送一个报文就会返回一个ACK,这样会导致消耗大量的时间,为了解决这个问题,TCP创建了滑动窗口机制,根据滑动窗口的大小可以连续传递非常多的TCP报文到服务器段,滑动窗口中的数据并不是直接用于服务器端,而是先进入到服务器端的接收缓冲区中,应用程序在缓冲区中进行读取TCP报文,当读取之后检验后向客户端发送ACK报文,客户端不需要等待每一个ACK报文,如果发送了1000个TCP报文,收到第1000个ACK那这1000条数据自然发送成功,随着收到的ACK报文,发送端的滑动窗口不断的进行右移,滑动窗口的大小是会随机变化的,根据接受缓冲区的剩余大小,随着ACK报文活动窗口大小返回给客户端,客户端根据使用情况动态的调整大小,在进行滑动窗口初始化时,根据三次握手建立连接的SYN报文初始化滑动窗口的大小
数据丢失:
当然在滑动窗口进行数据传递的过程中自然也会出现数据丢失的情况,分两种情况:
ACK报文丢失:
这种情况不需要担心,假如说发送端没有接受到第十个ACK报文,但是接受到了第20个ACK接受报文,自然而然就知道是ACK丢失,不需要进行处理
数据丢失:
应用程序在从接受缓冲区中进行数据的读取的时候,当处理到一个丢失的数据的时候就会发送ACK报文,如果没有接收到重发的数据就会重传ACK报文,当发送端发现重复的ACK报文就知道是数据丢失就会进行重传机制
番外补充:
接受缓冲区和发送缓冲区,是操作系统内核根据Socket的创建建立的缓冲区,是一个队列,应用程序可以抽象为通过Socket的方法从中获取到数据
八股-流量控制
当滑动窗口过大的时候,往往会造成很多的数据丢失,得不偿失,于是通过动态的调节滑动窗口的大小来达到流量控制的效果,前面已经提到,通过接受缓冲区的剩余空间结合使用情况来调整滑动窗口的大小,当接受缓冲区没有剩余空间的时候传回来的窗口大小为0,这个时候发送端暂停发送,进行超时等待,等待返回ACK数据,当超时后还没有获得ACK报文,发送端会发送一个不携带数据的探测数据报,询问接收端的回应,这个流量控制是在接受端大小上判断并进行控制,并不能完全达到效果,数据在传输的过程中还占大部分原因
八股-拥塞控制
上边提到了仅仅靠流量控制是不行的,它不可以调整数据传输路途中网络带宽的问题,每次判断滑动窗口的大小是公式是,滑动窗口=min(拥塞窗口,流量控制窗口大小) ,在建立连接初期初始化拥塞窗口为几个报文的长度,拥塞阈值是窗口的最大值,拥塞控制窗口大小的调整是无限循环慢启动-指数增长-线性增长 ,初始拥塞窗口后,首先每当接收到一个ACK报文,拥塞窗口就按照值数进行增长,一旦拥塞窗口到达拥塞阈值后,就会变成线性增长,当增长的过程中遇到大量的超时重传,就认为遇到了网络拥塞,我们将拥塞窗口重置为1,拥塞阈值为当前窗口大小的一半,在窗口的变化中,动态窗口根据公式在拥塞窗口和流量控制中动态切换
辅助调节滑动窗口的大小还有: 延迟应答和携带应答
- 延时应答
延时应答是一种机制,接收方在接收到一个 TCP 段后并不立即发送确认(ACK)报文,而是选择延迟一段时间后再发送 ACK。这段时间通常是为了等待更多的数据到达,从而可能使得ACK与其他数据一起发送
优点:可以减少网络上的 ACK 流量,因为接收方可能不会立即需要发送确认,而是选择在下一个数据包时一起发送确认。减少网络拥塞,提高效率。
- 携带应答
携带应答是当 TCP 发送方在向接收方发送数据时,将确认应答信息与数据一起发送的一种机制。例如,如果发送方有数据要发送,同时又需要确认收到的数据,它会将 ACK 信息嵌入当前的数据包中。
优点:避免了单独发送 ACK 消息的需要,从而减少了网络开销。提高了网络传输效率,通过将确认信息与实际数据结合,降低了数据包的数量。
八股-异常情况处理
根据TCP的可靠性同时也可以很好的解决TCP异常问题,比如说进程崩溃,主机关机,主机掉电,网线断开中的合理处理