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)),粗实线表示主动流程,虚实线表示被动流程,普通实线表示其他流程,例如上面两行说明的。
原文:https://www.cnblogs.com/iamwho/p/10469647.html