面试了几家公司,发现TCP是常问的内容,总结一波。说得不对的地方,欢迎评论指出。
1. TCP状态转换图
这张图在著名的《Unix网络编程》卷一中可以找到。这里参照这张图说明一下TCP连接建立和断开的过程。
2. TCP连接建立——三次握手
TCP连接的建立的过程,就是大家聊TCP的时候常聊的“三次握手”。这个过程和大家语音聊天有点像。假设,小刘和小章语音聊天,会下边的对话:
(1) 小刘:喂,能听到我说话吗?
(2) 小章:(听到小刘的声音。) 我能听到你说话,你能听到我说说话吗?
(3) 小刘:(听到小章的回应。)我也能听到你说话...
这里边,
过程(1)的目的是,让小刘试探他的信息能否够向小章的方向传递;
过程(2)的目的是,让小刘确定他的信息能否够向小章的方向传递,让小章试探她的信息能否够向小刘的方向传递;
过程(3)的目的是,让小章确定她的信息能否够向小刘的方向传递。
经过这三个过程,就可以确定小刘到小章,和小章到小刘两个方向的信息传递都畅通无阻,于是,可以放心的传递信息了,不用担心信息丢失。
这个过程,和TCP的三次握手是一个道理。“三次握手的过程”如下(参照文章开头的图理解和记忆):
(1) Client:发送SYN;
(2) Server:(收到SYN)回应SYN+ACK;
(3) Client:(收到SYN+ACK)回应ACK。
对照小刘和小章的聊天理解,好理解吧 ^_^
3. TCP断开连接
小刘和小章聊了很久,要说的全说了,该到洗洗睡了的时候了,怎么说呢。看看小刘和小章是怎么聊的:
(1) 小刘:宝贝,我困了,我想洗洗睡了。(请求结束聊天)
(2) 小章:亲爱的,我想想,还有什么事没说。(准备结束聊天)
(3) 小章:(小章想了一下,发现没啥说的了,同意聊天到此结束) 亲爱的,你睡吧
(4) 小刘:(听到小章同意结束聊天)好的,晚安
聊天结束
这里边(2)(3)可能被合并,小章可以直接说“亲爱的,你睡吧”,之所以分为两个过程,是因为小章可能要想很久^_^ , 要留一部分时间处理自己的事物。
我们再来看看TCP连接是怎么断开的(同样参照文章开头的图理解和记忆):
(1) Client:发送FIN;
(2) Server:(收到FIN), 发送ACK;
(3) Server:发送FIN;
(4) Client:(收到FIN), 发送ACK。
TCP连接正式断开。
注意(2)(3)可能被合并到一个TCP报文中,这个报文FIN和ACK都被标记。