面向连接的、可靠的、基于字节流的传输控制协议(TCP/IP)
前言
三次握手,四次挥手是面试中经常问到的问题,被提及的概率达到了80%,这个也是很多小伙伴的弱点,很多人在面试的时候无法正确的描述,只知道意思,所以你会听到不同版本的tcp/ip协议,有用男女朋友打电话来解释的,也有用两个人喊话来解释的,五花八门。但其实你能说明白也算是过关,我们今天来看看遇到这个问题时如何回答。
TCP报文段格式
TCP首部
TCP数据部分
6个控制位
- 紧急位URG:URG=1时,表明次报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用
- 确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACk置为1
- 推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付
- 复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输连接
- 同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文
- 终止位FIN:FIN=1时,表明此报文段发送方数据已发完,要求释放连接
三次握手流程
1. 标准版
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
- 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
2. 简单版
首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,这样TCP的一次连接(三次握手)的过程就建立了。
为什么是四次挥手?
这是因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Client端发送FIN报文仅仅表示它不再发送数据了但是还能接收数据,Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
四次挥手过程
刚开始双方都处于 establised(已建立) 状态,假如是客户端先发起关闭请求,则:
- 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于CLOSED_WAIT1状态。
- 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT2状态。
- 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
- 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
原理图
连接建立
SNY洪泛攻击
重传
连接释放
关于TCP/IP的面试补充
TCP(传输控制协议)和IP(网际协议) 是最先定义的两个核心协议,所以才统称为TCP/IP协议族
ISN: 发送方的字节数据编号的原点,让对方产生一个合法的接收窗口
1. 三次握手中第一次可以携带数据吗?
答: 不可以,三次握手还没有完成不能携带数据。
2. 为什么必须要三次握手,两次可以吗?
答: 不可以。
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常。
3. 三次握手的作用
- 确认服务器端和客户端的发送及接收能力正常
- 指定自己的初始化序列号,为后面的可靠传输做准备
- 如果是https协议,三次握手过程中还会进行数字证书的验证
4. TCP的作用
- TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
- TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。