前言
从今天开始,小陈开始更新《程序猿养成之路》系列博客,主要是为了准备最近的实习面试和即将到来的秋招面试 /(ㄒoㄒ)/~~。内容主要就是程序员面试八股文——数据结构与算法、操作系统、计算机网络相关知识。
Q&A
Q: 请你说一下TCP三次握手和四次挥手的过程?两次握手行不行?为什么不用四次?
A:
TCP三次握手过程:
- 客户端向服务器发送SYN和seq序列号(设seq为x);
- 服务器向客户端发送SYN请求连接和连接确认报文(SYN=1,ACK=1),序列号seq为y,确认报文x(ack=x+1);
- 客户端向服务端发送ACK确认报文,序列号为x+1,确认报文y(ack=y+1)。
TCP四次挥手过程:
- 客户端发出断开请求FIN,seq=u;
- 服务器确认客户端的断开请求ACK,ack=u+1,seq=v;
- 服务器端请求断开FIN,ACK,seq=w,ack=u+1;
- 客户端确认断开ACK,seq=u+1,ack=w+1;
两次握手和四次握手为什么不可以?
TCP是全双工通信,两次握手(一来一回)只能保证单向数据链路是畅通的,但是不能保证方向链路也畅通;
因此,为了保证双向链路畅通,需要进行2*2=4次握手,但是服务器的确认和请求可以合并为一步,因此只需要三次握手;
而在断开连接时,第2步服务器确认客户端的断开请求之后,客户端->服务器的单向链路就中断了,但是服务器->客户端的链路可能还有数据要发送,所以在挥手时,第2、3步不可以合并,也就成了“四次挥手”。
Q:TCP第四次挥手为什么要等待2MSL?
A:主要是因为两个理由:
为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。
他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从而保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。
TCP三次握手与四次挥手
计算机网络必学知识,期末考试以及工作面试八股文之首——TCP的三次握手和四次挥手的全过程。
一、TCP报文格式
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要保存对方信息(例如:IP,Port…)
报文主要段:
序列号seq:表示发送的数据字节流,确保TCP传输有序,对每个字节编号
确认序号ack:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
确认ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
同步SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接
终止FIN:结束标志,用于释放连接,为1表示关闭本方数据流
PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为1 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走 |
RST | 对方要求重新建立连接,复位 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 |
FIN | 希望断开连接 |
二、三次握手
建立TCP连接时,需要客户端和服务器共发送3个包。
第一次:客户端发送初始序号x和syn=1请求标志
第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1
第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1
三、四次挥手
第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态
第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)
第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。