TCP协议总结(理解三次握手,四次挥手)

TCP(传输控制协议)特点:

1.TCP是面向连接的运输层协议
2.TCP连接是点对点的,连接端点是两个套接字(socket=IP地址 : 端口号)
3.TCP是全双工通信,两端都可以发送接收数据
4.TCP数据传输是面向字节流的。

TCP可靠传输的工作原理:
1.停止等待协议(发送完一个分组之后停止发送,收到接收方的确认后再发送下一个分组)

  • 理想传输情况
    这里写图片描述

  • 接收的分组出现差错情况
    B在接收M1分组时检测发现M1分组出现差错,这时候B会丢弃错误的M1分组,不会发送确认给A,A在一段时间内收不到确认报文,就不会发送下一个M2分组,而是会重发M1分组,这个机制叫超时重传
    这里写图片描述

需要注意的有三点:

(1)A在发送M1时,要将M1的副本保存在发送缓存中,要直到接收到B发送来的确认收到M1的确认报文时才能清除M1副本。
(2)分组和确认分组都要编号,第一次发送的M1和超时重传的M1是通过编号区分的。
(3)超时时长,即重传时间要稍大于保文在AB之间传输的平均往返时间,但是由于网络的不确定性,这个时间非常难选择。

  • 确认丢失和确认迟到
    情况1:B发到M1分组后发送给A的确认报文丢失了,A没有接收到确认,就不知道发送给B的M1分组是出错还是丢失了,或者B发送的确认丢失了。A超时重传M1’,此时B收到了重传的分组M1’。
    此时B应该
    1丢弃重复接收的分组M1’
    2 向A再发送确认,因为A没有接收到对于M1的确认。
    这里写图片描述
    情况2:传输过程没出错误,但是A很晚才接收到对于M1的确认,此时A会接收到重复的确认,丢弃重复的确认,B也会收到重复的M1,也需要丢弃重复的M1,并且重传确认分组。
    (图很丑,但是很容易懂)
    这里写图片描述

2.连续ARQ协议(接收方采用累计确认的方式,对按序到达的最后一个分组发送确认)

3.滑动窗口协议(比较复杂,难以说清楚,要弄清楚各种窗口的概念)

接下来就是TCP协议的三次握手和四次挥手了(很重要,面试题常考点,TCP可靠传输的关键知识)

先有必要了解TCP报文段格式
这里写图片描述
再解析重要字段的意义:

扫描二维码关注公众号,回复: 2506735 查看本文章
  1. 源端口目的端口没得说
  2. 序号:TCP传输是面向字节流的,每一个字节都按照顺序编码,起始序号必须在建立连接时设置,报文段序号按照传输顺序依次+1。
  3. 确认号:期望收到对方下一个报文段第一个数据字节的序号,如果A接收到B的报文中确认号为N,那么表明,A传输的从起始序号到N-1为止的所有数据B都已经成功接收了。
  4. 数据偏移(在保留位左边):定义TCP首部长度。
  5. 确认ACK:仅当ACK=1时,确认号字段有效,当ACK=0时,确认号无效,TCP协议通信建立连接后所有传送的报文段ACK必须为1。
  6. 复位RST,RST=1时表示连接出现严重差错。
  7. 同步SYN:用来同步序号的,当SYN=1,ACK=0,表示请求连接报文,如果对方同意建立连接,则在响应报文段中使SYN=1,ACK=1.(知道这个看图就稍微容易点了,之前一直不懂这两个字段的作用,不必过分纠结)
  8. 终止FIN:当FIN=1时,表示报文段的发送方数据已经发送完了,请求释放TCP连接。

TCP面向连接—连接建立、数据传送、连接释放(TCP三次握手,四次挥手正式开始)

三次握手过程
这里写图片描述
过程:

  • A,B的TCP进程都能创建传输控制块,A主动打开TCP进程,向B发出连接请求报文段,此时“SYN=1,ACK=0,表示请求连接报文”,同时选择一个初始序号seq=client_seq,SYN需要消耗掉一个序号,A的TCP进程进入SYN-SENT(同步已发送)状态。
  • B处于Listen(监听状态)收到连接请求,同意建立连接,则向A发送确认报文段,此时 ”对方同意建立连接,则在响应报文段中使SYN=1,ACK=1“,同时也为自己选择一个初始序号seq=sever_seq,此时B已经确认收到A的请求报文段,所以确认报文段中的确认号ack=client_seq+1,表示B期望收到A的下一个报文段的序号是client_seq+1,B的TCP进程进入SYN-RCVD(同步接收状态)。
  • A收到B的确认报文之后还要向B发送一次确认报文,ACK报文段不携带数据则不消耗序号,A进入已建立连接状态。
  • 当B收到A的确认,都进入建立连接状态。
    问题:为什么A还要向B发送一次确认????
    答案:防止失效的连接请求再回到B,产生错误
    分析:假如A发送给B的连接请求报文由于网络延迟问题没有及时传到B,B就无法向A发送确认报文,A采用超时重传重新向发送连接请求,然后接收到了确认报文,A,B建立连接进行双方通信,释放连接后,第一次发送的连接请求报文才到达B,B误以为A又发出一次新的连接请求,又向A发出确认报文段,同意建立连接,要是没有第三次握手,那么B只要发出确认,新的连接就会建立,就会浪费很多资源(第三次发出确认,B收不到确认,就知道A没有要求请求建立连接)

四次挥手过程
这里写图片描述
这里的变量看着乱七八糟,有些败笔,但其实我个人认为四次挥手比三次握手更容易理解。

  • A发送完数据后TCP发出连接释放报文段,停止发送数据,主动关闭TCP连接,此时“当FIN=1时,表示报文段的发送方数据已经发送完了,请求释放TCP连接。”序号为发送完的最后一个字节+1,FIN会消耗一个序号,A进入终止等待1状态。
  • B收到A的请求连接释放报文后,会发送一个确认报文,这里不再赘述,B进入CLOSE-WAIT(关闭等待状态),这是半关闭状态,因为这里已经确认A没有数据发送给B了,但是B可能还有数据需要传送给A(也就是A->B方向的连接关闭了,而B->A方向还没关闭)
  • B的数据传完之后,会向A发送连接释放报文段,B进入LAST-ACK(最后确认状态),然后等待A的确认。
  • A接收到连接释放报文后,必须对此发出确认,B接收到确认后,B进入完全关闭状态,而A需要等待2MSL(MSL:最长报文生存时间)才能完全释放TCP连接。
    问题:为什么A需要等待2MSL才能关闭
    答案:1.为了保证A发送的最后一个ACK报文段能到达B。 2.防止“已经失效的连接请求出现再本连接中”

总结:参考谢希仁《计算机网络-第六版》,自己画图真的很幸苦,但是在过程中慢慢体会这个连接关闭的过程,还是很有收获的,记在博客上有时间翻出来多看看,TCP的窗口滑动,流量控制,拥塞控制还需要多看看书,以后再补充。

猜你喜欢

转载自blog.csdn.net/superxiaolong123/article/details/78279044