记录一下对tcp建立连接、数据传输、连接关闭过程的理解,加深印象和以后忘了可以再来查阅。
这里A代表客户端,B代表服务端
tcp三次握手
A---->B A向B打招呼(A给B发信息说我想和你建立连接)
A<----B B向A询问你是向我打招呼吗(B向A确认是否要和我建立连接)
A---->B A再次向B打招呼表明我是和你打招呼(A再次向B建立连接以表达诚意),B收到立即同意并建立了连接
tcp传输数据
write data read
A---------------->B
ack(我收到了数据)
A<----------------B
read data write
A<----------------B
ack(我收到了数据)
A---------------->B
A传输数据给B过程
A将数据写进套接字所在WriteBuffer中,内核将套接字WriteBuffer的数据通过网卡将数据发送出去;数据经过路由转发到B所在服务器的网卡写入到B对应套接字口ReadBuffer,B从套接字口的readBuffer中读取数据,B收到数据后回复一个ack消息个A,表明它收到了数据
B传输数据给A过程也是类似的过程,这里就不叙述了。
tcp4次挥手
A是客户端,B是服务端
established established
A-----------------------------------B
fin_wait1 想关闭连接 close_wait
A--------------------------------->B A给B发信息说,请关闭连接
fin_wait2 ack close_wait
A<---------------------------------B B给A回复说,好的我知道了
time_wait 我要关闭连接 last_ack
A<---------------------------------B B给A发信息说,我要关闭连接了
time_wait ack close
A--------------------------------->B A给B发消息说收到,B收到后关闭了连接
close close
A------------ --------------B A关闭连接释放套接字资源
简单的解释一下
0.开始A和B一直建立者连接,A和B都处于established状态
1.A想关闭关闭连接,A在发送想结束消息后会进入fin_wait1状态.B接收到A发来的想结束连接的消息后,向A发送ack消息,B进入close_wait等待状态;
2.接收到B发回ack消息,进入fin_wait2状态,等待B发出确定关闭的信息;
3.B给发送消息说,我要关闭连接了,B进入last_ack状态,A收到消息后,立即回复一个ack,并且状态进入time_wait状态,在接下来的4分钟一直是这个状态,4分钟过后进入closed的状态
4.B收到A发回的ack消息,关闭连接,释放套接字资源。
A因为是主动要求关闭连接所以,回复了B连接关闭后就进入了time_wait状态,这个状态下面会等待4分钟,4分钟后会进入closed状态,释放套接字资源
为什么会等待4分钟?
1.确保B收到响应,因为A可以重传ack,主要作用是确保B收到了A知道你要关闭了的信息,以免B重传它要关闭的信息
2.清理垃圾报文,等待一段时间确保没有无效的重复报文会因为网络原因延迟到达到,A将这些报文丢弃掉,以免后来的使用这个端口的程序收到垃圾报文
暂时是这样理解的,后面继续加深理解,搞得更清楚