今天刚上手blog,具体也不知道怎样操作会好看。简单面试题知识了解一下。
TCP协议
首先TCP提供面向有链接的通信传输。面向有连接是指在数据通信开始前做好端与端之间的准备工作。
作为网络工程师、编程人员面试高频问题无疑就是三次握手和四次挥手啦。既然如此就说说什么是三次握手和四次挥手吧:
三次握手
先看个拙劣的小故事吧:
- 今天小香猪拿着SYN(双氧奶)来到小香猪家门口,大喊seq(速度~),然后进入等待(SYN_SENT)状态。
- 大香猪闻到SYN(双氧奶)的味道知道是小香猪来啦,惊喜地说SYN、ACK(双氧奶、爱吃),以ack=J+1的速度(seq)打开了门,然后进入期待(SYN_RCVD)状态。
- 小香猪看见(检查)那J+1的速度,那1声ACK,确定是傻猪没错。责备他(ack是否为K+1,ACK是否为1),大猪使劲认错(建立成功),两只猪聊了起来(ESTABLISHED状态),完成了三次握手,一起去厨房做午餐了(传输数据)。
- 第一次握手:客户端将标志位SYN作为1,随机产生一个数值seq=J,并将此数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
- 第二次握手:服务器端收到数据包后借由标志位SYN=1知道了客户端请求建立连接,服务器端将标志位SYN和ACK都作为1,ack=J+1,随机产生一个数值seq=K,并将此数据包发送给客户端来进行确认连接请求,服务器端进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ack是不是为J+1,ACK是不是1,如果正确就将标志位ACK作为1,ack=K+1,并将此数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是不是为1,如果正确就连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,然后客户端和服务器端之间就可以开始传输数据了。
四次握手
- 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务期短的数据传送,客户端进入FIN_WAIT_1状态。意思是说“我客户端并没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,就不必急着关闭连接,可以继续发送数据。
- 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的信息。这个时候客户端就进入FIN_WAIT_2状态,继续等待服务器端的FIN报文。
- 第三次挥手:当服务器确定数据已发送完成,就向客户端发送FIN=N报文,告诉客户端“好了”,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
- 第四次握手:客户端收到FIN=N 报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack+N+1后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
一般情况下,面试过程也会出现问“为什么是三次握手,但是挥手就需要四次呢?”的过程,这时是不是方啦?继续往下看:
- 首先TCP的定位是全双工的、支持半关闭的、可靠的传输协议。三次握手是可以最低限度地确定双方的信息是双向可用的(全双工)。
- 假设是A向B发起请求。第二次握手成功表面A=>B没问题。第三次握手成功表明B=>A没问题。
- 同时服务器端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里面发送给客户端。
- 四次挥手呢,TCP要支持半关闭连接。建立的连接是全双工的,A<=>B双方都可以读写。支持半关闭意味着TCP支持A和B双方独立关闭通道。所以会有两次独立的关闭写通道的请求。一次关闭请求(FIN)就对应一个ACK。
随笔内容参考网络,故事拙劣敬请谅解!!