网络---传输层 TCP
TCP
TCP,控制传输协议,和UDP的差别很大,它充分实现了数据传输时的各种控制功能:
针对发送端发出的数据包的确认应答信号ACK
针对数据包丢失或者出现定时器超时的重传机制
针对数据包到达接收端主机顺序乱掉的顺序控制
针对高效传输数据包的滑动窗口控制
针对避免网络拥堵时候的流量控制
针对刚开始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制。
言归正传:TCP通过序列号、检验和、确认应答信号、重发控制、连接管理、窗口控制、流量控制、拥塞控制实现可靠性。
TCP选项
- MSS 选项 :发送SYN的TCP一段使用本选项通告对端它的最大分解大小。
- 窗口规模选项 : 就是TCP连接任何一端能够通告对端的窗口大小
- 时间戳选项: 防止失而复现的分组可能造成的数据损坏
滑动窗口
滑动窗口解决的是流量控制的的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。接收端的缓存传输数据给应用层,但这个过程不一定是即时的,如果发送速度太快,会出现接收端数据overflow,流量控制解决的是这个问题。
https://blog.csdn.net/wdscq1234/article/details/52444277
可以看这里,其实很简单的东西,主要要注意当滑动窗口中的数据等待超时了发生的重传机制
拥塞控制
https://blog.csdn.net/qq_41431406/article/details/97926927
连接和释放
三次握手
https://blog.csdn.net/cmm0401/article/details/77865479
四次握手
https://blog.csdn.net/cmm0401/article/details/77865479
为什么建链接要3次握手,断链接需要4次挥手
对于建链接的3次握手,主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)
因为TCP是全双工的,所以,发送方和接收方都需要Fin和Ack。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。
TIME_WAIT状态
1.time_wait状态如何产生?
从上面的两张图可以看到,当客户端发送完最后一个ACK后会转换为TIME_WAIT状态.客户端会在这个状态停留2MSL(两倍的最长分解生命期)时间.
2.time_wait状态产生的原因
(1)可靠的实现TCP全双工连接的终止
我们可以假设,当客户端最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(服务端)将会重新发送FIN,在FIN到达之前,客户端必须维护状态信息,以允许他重新发送最终那个ACK.假如客户端发送完ACK后就完成终止释放了,那么它将响应一个RST分节,该分节将被服务器解释成一个错误.如果TCP打算执行所有必要的工作以彻底终止某个链接上两个方向的数据流,即全双工关闭,那么它必须正确处理链接终止序列四个字节中任何一个字节丢失的情况.
(2)为使旧的数据包在网络因过期而消失
这个原因网上有些解释不是很清楚,我参考了UNIX:网络编程1卷后后的理解:我们可以假设这个状态不存在,然后在服务器和客户端之间有一个TCP连接,我们关闭连接后,在相同的端口上建立同样的连接.由于端口和IP都和之前的一样,TCP协议无法辨别.这时候我们假设客户端刚才关闭连接的时候最后发送的ACK超时了,在我们建立了新连接的时候又出现了(这个TCP字节的分组我们称为迷途的重复分组),那么TCP将会误解为这个ACK是新连接中客户端传来的最终引发错误!
为了避免这一点,TCP将不给那些处于TIME_WAIT状态的连接发起新的连接,同时既然TIME_WAIT状态持续时间是MSL的两倍,那么足以让两个方向上的分组最多存活MSL秒就丢弃.
4.time_wait状态如何避免
首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。
SCTP
流控制传输协议。SCTP在客户和服务器之间提供关联,并且像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。