TCP协议中,A和B相互通信具体流程
TCP是一种面向连接的协议,通信双方需要先建立连接,然后才能传输数据.TCP协议中,A和B相互通信的流程如下:
1.建立连接(三次握手)
A向B发送一个SYN数据包,请求与B建立连接,B收到SYN数据包后,发送一个SYN+ACK数据包作为响应,最后A再向B返回一个ACK作为响应,说明A已经收到了B发来的数据了.此时连接建立完成
2.相互通信
连接建立后,A就可以向B发送数据了,A将要发送的数据分成若干个数据段,每个数据段都有一个序号表示数据段的第一个字节在整个字节流的位置,B收到A发送的数据后,会发送一个ACK作为响应,这个ACK数据包中有一个确认序号,是A发送的最后一个字节的序列号+1,表示期望收到下一个字节的序号.
提高效率
为了进一步提高效率我们会有滑动窗口,延时应答和捎带应答的机制.滑动窗口可以不等待的发送一批数据,使用同一份时间来等待这组ACK,把不需要等待,直接发送的数据的最大值称为窗口大小.窗口越大,传输效率就越高.这个窗口大小是根据接收放的处理能力和中间节点的处理能力来共同决定的,延时应答让接收方的先处理一些数据,再返回ACK,这样可以让窗口更大一些,同样延时应答也可以少返回一些ACK,节省了一些资源.捎带应答可以让本来分几个数据包发送的数据合并成一份(前提是发送时机相同),这样就节省了一些资源.提高了传输效率.
避免网络拥堵和延时
当然为了避免网络拥堵和网络延时,会对窗口大小进行限制.此时就有流量控制和拥塞控制等机制,流量控制考虑了接收方的处理能力,会告诉发送方接收方接收缓冲区剩余空间大小,以此让发送方调节窗口大小.拥塞控制考虑的是网络中间节点设备的处理能力,通过实验的方式得到一个合理的中间节点的处理能力,发送方再据此调节窗口大小
通信过程中丢包处理
通信过程中丢包了,会有超时重传的机制,一旦丢包发送方就会收不到接收方的ACK,此时发送方会等待一段时间(2MSL),如果超过这个时间就会重新发送刚刚的数据包.在数据密集使用滑动窗口的传输中,超时重传会变成快速重传,当接收方连续收到三个发送方相同的确认序号时,就会重新发送确认序号索要的数据
通信过程中出现异常处理
如果是进程崩溃,比如A进程崩溃,会立即向B发送一个FIN,断开连接,此时会触发四次挥手,但四次挥手不一定能完成,由于连接已经断开了,A不能收到B的FIN和ACK给B返回ACK.只能等待超时再断开连接失败后关闭.如果是关机,关机前会杀进程,A会正常完成四次挥手操作.如果是主机掉电/网线断开,此时触发不了四次挥手,只能等待超时后关闭了
3.断开连接(四次挥手)
当A发送完所有数据后,会发送一个FIN数据包作为结束标志.B收到FIN数据包后,发送一个ACK数据包作为响应,表示已经收到了A的FIN,然后B也会发一个FIN数据包,A收到FIN后,发送一个ACK作为响应,表示已收到B发来的FIN,连接已关闭