首页 > 其他 > 详细

TCP

时间:2019-03-04 12:16:02      阅读:179      评论:0      收藏:0      [点我收藏+]

1.TCP协议分析流程


  [1]要分析整个TCP协议,需要从外向里去分析,首先就是分析af_inet.c,这个里面就是inet的接口函数,例如bind()、listen()等等,之后就是弄清楚这些函数(函数的参数)是要干什么。

  [2]之后继续分析TCP的握手流程。

  [3]之后继续分析TCP的数据传输流程。

  [4]之后继续分析TCP的断链流程。

  [5]之后继续分析TCP的拥塞控制流程。

  [6]之后继续分析TCP的其他分支流程。

2.TCP连接建立(三次握手)


  TCP的根本目的是可靠地传输数据,如果不需要可靠地传输,则不需要握手,直接发数据就可以(例如UDP)。

  而为了保证可靠地传输数据,便需要两端维护一些信息(序号、ACK号等等)。握手就是同步这些信息的过程,只有保证信息同步完成了,才能开始交互数据。

    [1]A向B发送SYN,A向B同步本端的连接信息(seq、MSS、SACK选项等等)。

    [2]B向A发送SYN ACK,SYN表示B向A同步本端的连接信息(seq、MSS、SACK选项等等),ACK表示对A的SYN的确认。

    [3]A向B发送ACK,对B的SYN的确认。(A发送出去后便进入到establish状态,而B需要成功收到ACK后进入establish状态)

  意思就是我有你的信息,我还知道你有我的信息(因为我收到了ACK),我便单方面宣布握手完成。

  另外解释为什么不是两次握手,其实握手的目的是为了正式传输数据之前同步信息,如果是前两次握手消息并不能保证信息确认同步完成(B向A发送了SYN ACK后不能直接进入establish状态,因为B不能保证A收到了自己的SYN报文)。

3.TCP连接释放


  可以看到连接建立是一个不同时发生的过程,即A先完成进入establish,而B要靠后进入establish。也就是谁主动发起连接谁先进入establish。

  而连接释放时,谁先主动fin,便要靠后进入close:

    [1]A向B发送FIN。    A进入FIN-WAIT1状态

    [2]B向A发送ACK。    B进入CLOSE-WAIT状态,A收到ACK后进入到FIN-WAIT2状态

    [3]B向A发送FIN ACK。   B进入LAST_ACK状态

    [4]A向B发送ACK。    A进入TIME_WAIT状态,并且等待2MSL后进入CLOSE状态

  连接释放的目的是关闭本端的连接(进入CLOSE状态),因为最后对B来说四次挥手全部完成,所以B收到最后的ACK后便可以直接关闭连接,而由于A发送ACK之后不会再收到后续报文,并且A无法保证最后的ACK被B收到,所以A要等待2MSL之后再关闭连接(进入CLOSE状态)。另外就是谁主动关闭连接谁进入CLOSE_WAIT,并不区分客户端还是服务器。

  另外,有一种情况,就是本端发送了FIN之后,没有收到ACK,而是收到了对方的FIN(同时FIN),则此时当然是给对方发送ACK,并且进入CLOSING状态,并且收到对方的ACK之后,进入到TIME_WAIT状态。

  另外,有一种情况,就是本端发送了FIN之后,没有收到ACK,而是收到了对方的FIN_ACK(同时FIN),则此时当然是给对方发送ACK,并且本端直接进入到TIME_WAIT状态。                       

 4.TCP有限状态机


  下图的线并不代表某端,而是表示流程(例如客户端可以主动打开(客户端发送SYN)但是被动关闭(服务器首先发送FIN)),粗实线表示主动流程,虚实线表示被动流程,普通实线表示其他流程,例如上面两行说明的。

技术分享图片

TCP

原文:https://www.cnblogs.com/iamwho/p/10469647.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!