TCP三次握手您能搞得清、讲的明吗?

相信很多技术的小伙伴在面试的时候被面试官问到过什么是TCP/IP三次握手和四次挥手吧,小编最近面试了几家都考到这个知识点,自认为很熟悉的我噼里啪啦的给对方讲解了一番,然后有一家面试官说了一句把状态也加上,瞬间懵逼,今天小编整理了一下,分享给大家。

TCP三次握手您能搞得清、讲的明吗?

TCP/IP三次握手产生的原因

有两台主机A和B要基于TCP进行通信,主机A中的某个应用进程主动发起连接建立称为TCP客户端,主机B被动等待连接建立的应用进程,称为TCP服务端,我们可以将TCP建立连接的过程称为握手。握手需要在客户端和服务器之间交换3个TCP报文段。

3个报文建立TCP连接的过程

主机AB的状态

最初两端的TCP进程都处于关闭状态(CLOSED)

第一次握手

主机B发生了什么

一开始主机B中的TCP服务器进程首先创建传输控制块,用来存储TCP连接中的重要信息,例如TCP连接表,指向发送和接收缓存的指针,指向重传队列的指针等

之后就准备接受TCP客户进程的连接请求

主机B的状态

此时TCP服务器进程就进入监听状态(LISTEN),等待TCP客户进程的连接请求,TCP服务器进程是被动等待,来自TCP客户进程的连接请求而不是主动发送,因此称为被动打开连接

主机A发生了什么

主机A中的TCP客户进程也是首先创建传输控制块,然后再打算建立TCP连接时向主机B发送TCP连接请求报文段,并进入同步已发送状态,TCP连接请求报文段守护中的同步位SYN被设置为1,表明这是一个TCP连接请求报文段,seq字段被设置了一个初始值x作为TCP客户进程所选择的初始序号,请注意TCP规定SYN被设置为1的报文段不能携带数据但要消耗掉一个序号,由于TCP连接建立是由TCP客户进程主动发起的,因此称为主动打开连接

SYN:同步位 1:表明是一个TCP请求报文段

seq:x为TCP客户进程所选择的初始序号

主机A的状态:

同步已发送状态(SYN-SENT)

第二次握手

主机B发生了什么

主机B中的TCP服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向主机A的TCP客户进程发送TCP连接请求确认报文段,并进入同步已接收状态,TCP连接请求确认报文段守护中的同步位syn和确认位ack都设置为1,表明这是一个TCP连接请求确认报文段,seq字段被设置了一个初始值y作为TCP服务器进程所选择的初始序号,确认号ack字段的值被设置成了x+1,这是对TCP客户进程所选择的初始序号的确认,请注意这个报文段也不能携带数据,因为他是syn=1的报文段,但同样要消耗掉一个序号

主机B的状态

同步已接收状态(SYN-RCVD)

第三次握手

主机A发生了什么

主机A中TCP客户机进程收到TCP连接请求确认报文段后还要向主机B中的TCP服务器进程发送一个普通的TCP确认报文段并进入连接已建立状态,TCP确认报文段守护中的ACK被设置成1,表明这是一个普通的TCP确认报文段,序号seq字段被设置为x+1,确认号ack字段被设置为y+1,由于TCP客户进程发送的第一个报文段的序号为x且不携带数据,因此第二个报文段的序号为x+1,请注意TCP规定普通的TCP确认报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下所发送的下一个数据报文段的序号仍是x+1,确认号ack字段的值被设置成了y+1,这是对TCP服务器进程所选择的初始序号的确认,主机B中的TCP服务器进程收到该TCP确认报文段后也进入连接已建立状态,现在TCP双方都进入了连接已建立状态,它们可以基于已建立好的连接进行数据传输了

主机A的状态

进入连接已建立状态(ESTABLISHED)

主机B的状态

进入连接已建立状态(ESTABLISHED)

END


分享到:


相關文章: