最近准备面试题,看到有介绍计网中的TCP三次握手和四次挥手操作及其代表的含义的题,复习了一下,顺便记录下来吧。
注:图片来自中国大学MOOC 哈尔滨工业大学 计算机网络之探赜索隐 聂兰顺老师的慕课,讲得很好,大家如果还有什么不清楚的可以直接搜慕课看。
TCP连接特点:
点对点:一个发送方,一个接收方
可靠的、按序的字节流
流水线机制:TCP拥塞控制和流量控制机制设置窗口的尺寸。
发送方/接收方缓存
双全工:同一连接中能够传输双向数据流
面向连接:通信双方在发送数据之前必须建立连接。
连接状态只在连接的两端中维护,在沿途节点中并不维护状态
TCP连接包括:两台主机上的缓存,连接状态量、socket等。
流量控制机制
TCP段结构:
序列号和ACK
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.
它们的含义是:
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
重点来了,TCP的三次握手到底是什么意思呢? TCP建立连接的过程如下图所示:
TCP建立连接的过程可具体形容为三次握手,首先,client端发送连接请求的报文【SYN】,Server端接收到连接后回复确认报文【ACK】,于此同时,服务器端为其分配资源,Client端收到Server端的ACK报文之后也向其发送ACK报文,同时准备资源,就这样,连接建立了,这三个操作也被称为三次握手。
TCP连接关闭的过程如下图所示:
每一步的操作图上说的已经很清楚了,我再来描述一遍,假设Client端想断开连接,那么它会向Server端发送关闭连接报文【FIN】,注意,这只是给Server端先打个招呼说将要断开连接,如果Server端东西还没发送完的话还可以接着发送,套接字并不会立刻关闭,Server端收到之后回应一个ACK,说我收到你打的招呼,知道你想断开连接,但还没准备好,准备好给你发FIN,前两次挥手就大概是这个意思。当Server端准备好断开连接后,它会向Client端发送关闭连接报文【FIN】
对Client端说,我准备好关闭连接了,由于网络可能存在收不到的问题,Client端必须回应一个确认报文【ACK】 说:OK 我知道了,然后Server端就断开了连接,而Client端在发完ACK之后会等待2MSL,如果没有收到回复,就说明连接已经断开了然后Client再关闭连接,回收之前开启连接时分配的资源等等。
以上就是四次挥手的过程。
Client端和Server端的状态转移如下图所示:
面试官:为什么是三次握手,而断开连接需要四次挥手?
因为在建立连接的时候,Server端收到SYN【建立连接请求】的时候,直接回复ACK和SYN【ACK确认,SYN同步信息】,然后Client发ACK就可以了,所以是三次
在断开连接的时候,Server端收到Client端的FIN报文【断开连接请求】的时候,可能还有数据没有发送完,所以只能先告诉Client端说知道了,但是还没准备好,准备好了再发FIN告诉你【并不能连着ACK一起发,ACK要准备好断开之后才能发送,所以多了一次,是四次挥手】。由于网络存在丢包现象,所以当Client端收到Server端的FIN包时,必须要发个ACK报文,告诉他说我已经知道你准备好断开了,不然可能存在两端都不确定到底对面准备好断开没有的情况。
最后Client端通过等待超时来结束四次挥手。
叙述有点啰嗦,但大意就是这样。