TCP是传输层的一个协议,在了解他的原理之前先简单介绍一下传输层:
所以接下来介绍一下TCP报文段的格式.
TCP报文段的首部格式
具体介绍:
可靠传输的工作原理
我们知道网络传输是不可靠的,因为网络有着许多的不可控因素。那么要达成可靠的传输,我们需要满足以下两点。
1.数据能够准确传递到接收端
2.接收端处理数据的速度要能够跟上发送方发送数据的速度。
针对这两点,于是就有了停止等待协议。
什么是停止等待协议呢?
简单来说发送方在每次发送数据之后,必须要等到接收方的确认响应之后再继续发送后面的数据。很明显这样做虽然很简单,但是同样会带来一些问题。
问题一:发送方在发送完数据之后,需要一直等待接收方的确认答复。这样网络传输的效率非常低。
问题二:如果传输过程中有差错导致接收方没有接收到数据,那么接收端不会恢复确认,而发送方一直等待接收端的答复,那么就形成了死锁。
针对问题二,为了避免死锁的出现,于是有了超时重试机制。发送方会维护一个超时时间和一个信息的副本(用于重试,接收到确认信息后才删除),发送方发送完信息之后就会启动一个超时计时器,超时之后如果没有收到接收方的确认信息,那么就会重新再次发送。如果在超时时间内接收到了确认信息就撤销超时计时器。
这样死锁问题得到了解决,但是问题一的问题依旧存在,信道的利用率太低了,导致网络传输的速率太慢了。所以需要进一步优化。于是就有了滑动窗口协议。而TCP正是基于滑动窗口协议来实现可靠传输的,所以我们重点分析滑动窗口协议。
滑动窗口协议
什么是滑动窗口协议?
将数据以字节为单位,并且为每个字节设置一个序号,并且发送端和接收端都需要维护一个窗口。
发送端:只有在发送窗口内的数据才可以被发送,发送窗口发送完数据之后需要等待接收端的确认,如果数据被确认之后,那么发送窗口就向右移动。
发送端滑动窗口示意图:
接收端:接收并且已经发送过确认消息的数据可以不用保存,只有在接收窗口内的数据才可以被接收。并且在接收端会维护一个期望收到的序列号(在图中也就是3),如果接收端接收到了4,5,6,但是没有接收到3,那么是不能够发送确认消息的。直到接收到序号3的数据,才会发送3,4,5,6的确认信息给发送端,然后将接收完的数据丢弃,并且向右移动接收窗口的预期接收序号值。
接收端滑动窗口示意图:
同样为了避免死锁,发送窗口协议同样有超时重发机制。
超时重发机制需要注意的是:接收端如果接收到一样的数据,那么可以直接丢弃数据,但是每次接收到数据,依旧需要发送确认接收消息给发送端。
很明显,滑动窗口协议相对于停止等待协议的信道利用率得到了很大的提高
“三次握⼿”和“四次挥⼿”
传输连接的三个阶段
TCP 的“三次握⼿”
“三次握⼿”:
“四次挥⼿”
![](https://img-blog.csdnimg.cn/6bb069b9b586401b960a01177add8ba4.png)
![](https://img-blog.csdnimg.cn/aa09a0e0ca5441259326f852f81ad3dd.png)
过程介绍:
其中[ ]就代表1;例如[SYN]就代表SYN = 1,此处我们使用的是本机向39.156.66.18这个地址(百度的地址)发送信息
三次握手:序号1,2,3
第一次握手:由本机地址向目标地址发送连接请求,其中SYN = 1,ACK = 0就代表这是一个连接请求报文段。
第二次握手:目标地址接收到本机地址发送的请求并发送确认,其中SYN = 1,ACK = 1代表这是一个连接确认报文段。
第三次握手:本机地址接收到目标地址的确认后向目标地址再次发送确认,建立连接成功
四次挥手:序号6,7,8 序号4,5是本机向目标发送完信息后目标接收的过程 ,接收后目标地址主动关闭,开启四次挥手过程
第一次挥手:由目标地址向本地地址发送终止信息,也就是FIN = 1,并且让 PSH = 1 使其快速推送
第二次挥手:本地地址接收到目标地址发送的信息并向目标地址发送确认
第三次挥手:本地地址像目标地址发送终止信息
!第二次和第三次挥手可能会一起发生
第四次挥手:目标地址接收到本地地址的信息并发送确认,本机地址接收到确认后关闭,目标地址在发送确认的2MSL后关闭,连接释放