我是靠谱客的博主 大力短靴,最近开发中收集的这篇文章主要介绍网络基础(2):TCP,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、TCP报文
特点:
**面向连接:**在通讯前先建立一条连接
**基于字节流、可靠传输:**发送到字节流之间存在关联,接收端收到乱序可以恢复顺序,接收端每接受一条数据,会返回一个确认,
**缓冲传输、流量控制:**接收端接受的数据先存在缓冲区,并告诉发送端缓冲区还有多大空间
**全双工:**每个端口既可以发送数据也可以接收数据

TCP报文:
在这里插入图片描述
序号:表示这个报文段中第一个数据字节序号
确认号:用来给对方确认的,对于自己来说是期望下一次接收到的数据,接收到的序列号+数据大小+1
头部长度:4位,最多60字节
保留号:6位,必须为0
标志位:URG(紧急指针有效)、ACK(确认序号有效,发送ACK有延时,等待是否有数据 一起发送,如果有会将ACK和数据一起发送)、PSH(接收端应尽快将报文交给应用层,这里包括已经这个报文之前的所有报文)、RST(连接重置)、SYN(发起连接)、FIN(终止)
窗口大小:用来控制流量
校验和:对头部和数据进行校验
选项数据:MSS,在建立连接的时候确认;窗口扩大因子;时间戳

二、建立断开连接
三次握手:
在这里插入图片描述
问题:为什么三次握手?
假设只需要两次握手的话,假设有个请求建立连接的SYN报文,延时后被服务端接收,服务端就会发送ACK报文,这样两次握手就能建立连接。而服务端和客户端之间没有消息交换,这样就会造成资源浪费。

四次挥手:
在这里插入图片描述
问题:为什么存在time_wait?(MSL为报文最大生存时间)
time_wait是主动关闭方最后一次发送给被动关闭方确认信息后所处的状态,**一是为了最后的确认消息能够到达服务器,因为最后一次ACK报文段可能丢失,需要重传。二是为了让所有旧报文都消失,对之后的连接不会产生影响。**此时主动关闭方的port不能使用,若服务器为主动关闭方,则需要等待2MSL,该port才能继续使用。

在2MSL时间内,系统重启,重新建立连接,则旧报文和新报文会产生歧义,因此TCP重启后要等待MSL才能建立连接,这个时间叫做平静时间。

RST的使用:
发送一个报文出现问题,就会发送一个复位报文。
例如:正常建立后,服务器重启,客户端继续发送消息,服务器就会返回RST包,客户端会释放所有的资源(UDP发送ICMP不可达报文)

在这里插入图片描述

三、成块数据流:
滑动窗口:
在这里插入图片描述
左边沿右移,窗口合拢(数据被确认接收和发送的时候出现),右边沿右移,窗口张开(接收方进程读取了缓冲区的数据并释放了缓存

**窗口更新:**接收方发送ACK以及窗口大小=0,发送方不再发送数据。一段时间后(在窗口增加了2MSS或者增加了窗口大小的一半)接收方会发送ACK(窗口更新)告知窗口大小

慢启动算法:
慢启动的目的是:防止一开始速率过快,导致耗尽中间路由器存储空间,从而严重降低TCP连接的吞吐量,理想状态达到发送速率和接收ACK速率相等
拥塞窗口:TCP为发送方增加一个窗口(拥塞窗口),初始化为MSS,每收到一个ACK,就增加一个MSS,发送方取拥塞窗口和通告窗口的最小值作为发送大小

四、超时和重传:
重传定时器:TCP会根据RTT发送数据,接收该数据的ACK之间的时间来设定超时时间RTO

计时器一次只能记录一个报文的时间,也就是发送多个报文,只会计时第一个报文
当接收到的

当客户端向服务端发送了5个包,其中第2个包超时:
服务端:正常接收第一个包,返回ACK=2,第二个包超时,第345都正常接收存在缓存区,每次返回的ACK=2,客户端重传之后,返回ACK=6的包
客户端:连续接收3次ACK相同的包后,就会重传那个包,即重传2

出现拥塞的两种情况:超时(慢启动算法)和接收到重复的确认(拥塞避免算法)拥塞避免的目的是:当拥塞发生时,降低网络的传输速率
拥塞窗口(cwnd)、慢启动门限(ssthresh)
初始化cwnd=1个报文段,ssthresh=65535字节

超时:
1)拥塞发生时候,ssthresh设为拥塞窗口和通告窗口最小值的一半,cwnd=1;
2)**(cwnd<ssthresh,为慢启动,否则为拥塞避免):**如果是慢启动,每收到一个ACK,增加1个MSS,慢启动最后会变成拥塞避免;如果是拥塞避免,每次收到一个ACK,增加1/cwnd个

连续相同的ACK:(重发之后仅当cwnd>已经接收未被确认的数据的大小才能发送新数据)
1)拥塞发生时候,ssthresh设为拥塞窗口的一半立即重发报文(快速重发算法)
(快速恢复算法)
2)设置cwnd为ssthresh+3*MSS,每次收到一个重复的ACK,cwnd+MSS
3)当确认新数据的ACK(确认了丢失的包以及之前已经被接收的包)到达时,设置cwnd=ssthresh+MSS,然后进入避免拥塞算法.

五、ICMP差错
**源站抑制:**接收数据报的速度比其处理速度快
采用慢启动算法,cwnd=1,但是ssthresh不变

不可达差错:不处理

六、定时器:
坚持定时器:当接收方的滑动窗口满了之后,会告知发送方停止发送,若此时应用获取了接收方的数据并释放缓存,接收方会发送ACK告知窗口大小,若该报文丢失,发送方会等待接收方发送窗口大小,接收方会等待发送方发送数据,造成死锁。

发送方:为了避免这种情况,发送方使用一个坚持定时器(使用指数退避),周期性地探查接收方的窗口大小,这些报文叫做窗口探查。当接收方告知窗口大小为0,发送方的坚持定时器启动,超时会发送窗口探查报文数据段1个字节。会一直探查直到窗口打开或者连接断开

接收方:将1个字节存储在缓冲区,并发送ACK,并不确认该字节,而是确认之前收到的字节。

这样会出现模糊窗口综合征,即服务端应用接收了一点数据,服务端就会通知客户端窗口打开。
接收端 1)不通告小窗口,即窗口大小小于一个MSS 2)窗口增加了一半大小
发送端只发送1)满长度的报文 2)长度为通告窗口一半的报文

保活定时器:
客户端和服务器之间可以不发送消息,其中一方想要直到另一方是否崩溃或者关机,保活计时器超时就会发送探查报文,跟窗口探查报文类似,也占一个字节,

客户端状态:
1)正常运行,服务端发送保活探查报文,响应正常。每次通信后保活计时器就会开始计时
2)崩溃,多次保活报文没有响应,服务端就会断开连接
3)崩溃并且重启,会返回一个RST报文,服务端释放连接
4)正常运行服务器不可达,同2

最后

以上就是大力短靴为你收集整理的网络基础(2):TCP的全部内容,希望文章能够帮你解决网络基础(2):TCP所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部