传输层协议简介

tcp协议

该协议的作用是保证数据通信的完整性和可靠性,防止丢包。
特点如下:
面向连接的可靠的面向字节流的有流量控制阻塞控制负载较高

upd协议

面向无连接的不可靠的面向数据报的无流量控制无阻塞控制负载相对较低

tcp与udp的区别

1
2
3
4
5
6
(1)TCP协议在传送数据段的时候要给段标号;UDP协议不
(2)TCP协议可靠;UDP协议不可靠
(3)TCP协议是面向连接;UDP协议采用无连接
(4)TCP协议负载较高,采用虚电路;UDP采用无连接
(5)TCP协议的发送方要确认接收方是否收到数据段(3次握手协议)
(6)TCP协议采用窗口技术和流控制

tcp的流量控制

为了提高信道的利用率TCP协议不使用停止等待协议,而是使用滑动窗口协议(连续ARQ协议)
意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认。
而所谓流量控制就是让发送端发送的数据过多或者数据发送速率过快,接收端来不及处理,则会造成数据在接收端的丢弃。
利用滑动窗口(零窗口,坚持定时器)机制就可以实施流量控制。
关于滑动窗口机制:

1
2
3
4
5
接收端可以用大小为0的窗口(目前不能在接受数据了)通知发送端停止发送数据流。
但是如果下一次窗口不为0的应答在传输过程丢失,发送者一直等待下去
而接收者以为发送者已经收到该应答等待接收新数据,这样双方就相互等待,从而产生死锁。
所以还需要用定时器机制处理,每当发送者收到一个零窗口的应答后就启动该计时器
发送端定时发送探测报文段,接收端应答不为0,就继续定时发送,直到接收端缓存不为空。

tcp的阻塞控制

为什么会产生TCP的阻塞呢, 其实就是发送端发送的报文速度要比接收端处理数据速率大。
TCP对于阻塞控制一共有四种算法,分别是慢开始阻塞避免快重传快恢复四种算法。
由于需要考虑拥塞控制和流量控制两个方面的内容, 因此TCP的真正的发送窗口=min(rwnd, cwnd)(接受窗口, 拥塞窗口)

慢启动

怎么知道接收方线路的理想速率是多少呢,需要慢启动慢慢试
始的时候,发送得较慢,然后根据丢包的情况调整速率,如果不丢包,就加快发送速度;如果丢包,就降低发送速度。

阻塞避免

到达阈值以后,加法增加。
从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,
但是cwnd不能一直这样无限增长下去,一定需要某个限制。
TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。
拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加。
此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加,
这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。

阻塞避免的图片

快重传

收到三次同样的ack以后,立即发送该syn报文,并启用快恢复
ack是指:一个确认消息,携带了期待要收到下一个数据包的编号和接收方的接收窗口的剩余容量
快重传

快恢复

如果发送方设置定时器超时,那么很可能是网络出现了拥塞,
致使TCP报文段在网络中的某处被丢弃。在这种情况下
开始门限值减半,然后使用阻塞避免的增加法

面向连接的(tcp的三次握手)

序列号:seq, 确认号:ack, syn:报文
客户端发送SYN报文,置发序列号为X
服务端发送SYN+ACK报文,并置发序列号为Y,确认序列号X+1
客户端发送ACK报文,并置发序列号为Z,确认号Y+1

1
2
3
4
5
第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态

第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

四次挥手

主动发送Fin+Ack报文,并置发序列号为X
被发送方发送ACK报文,并只发送序列号为Z,确认号X+1
被动方发送Fin+Ack报文,并只发送序列号Y,确认号为X
主动发发送ack报文,并只发送序列号X,确认号Y

1
2
3
4
第一次挥手:客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。[A告诉B我要和你断开连接了]
第二次挥手: 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。 [B发送发可能还有数据没有发送完给A,把剩余的数据发送出去]
第三次挥手: 与客户端A的连接,发送一个FIN给客户端A(报文段6)。 [B发送方告诉A我要断开和你的连接了]
第四次挥手: CK报文确认,并将确认序号设置为收到序号加1(报文段7)。 [A告诉B我收到了你要和我断开连接的消息]

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,
它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。
但关闭连接时,当收到对方的FIN报文通知时,
它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了
所以你可能未必会马上会关闭SOCKET, 以及你可能还需要发送一些数据给对方之后,
再发送FIN报文给对方来表示你同意现在可以关闭连接了,
所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

文章作者: woyao
文章链接: https://chenwoyao.github.io/2021/04/23/计算机网络/传输层协议简介/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 woyao的博客