TCP用3次握手建立连接的过程
注意:TCP客户端主动建立连接,TCP服务端等待连接
- 起初客户端处于关闭状态,服务器处于监听状态
- 第一次握手:客户端主动发送建立连接的请求报文,进入同步已发送状态
- 其中主要的字段为
SYN=1,seq=x....
等
- 其中主要的字段为
- 第二次握手:服务器接收到报文后,如果同意建立连接,则发送TCP连接请求的确认报文,然后进入同步已接收状态
- 其主要字段
SYN=1,ACK=1,seq=y,ack=x+1...
等
- 其主要字段
- 第三次握手:客户端接收到服务器的确认报文后,给服务器再次发送确认报文,然后进入连接已建立状态
- 其中主要字段为
ACK=1,seq=x+1,ack=y+1...
- 其中主要字段为
- 服务器接收到来自客户端的报文后,也进入连接已建立状态。至此连接建立成功,就可以进行数据传输了!
- 其中
SYN=1
表示这是一个同步报文;ACK=1
表示这是一个确认报文;seq
表示数据序号;ack
表示对接收到报文序号seq
的确认 - 对于
SYN=1
的报文,TCP规定其不能携带数据但消耗一个序号,也即下一个报文seq要加1 - 对于
SYN=0
的普通报文如果不携带数据,就不消耗序号
问题:可不可以将3次握手修改为2次握手?这么做是为了什么?
回答:不可以!原因如下
- 2次握手时,假设客户端的TCP连接请求在网络中滞留导致客户端重发,若当该连接通信成功后结束时第一次的TCP连接请求才到达服务器,此时服务器会认为这是一次新的请求。
- 然后同意建立连接,直接进入连接已建立状态,然后给客户端回复确认请求。
- 客户端此时仍处于关闭状态,不会理睬该报文,这将导致服务器一直处于等待客户端传输数据的状态,白白浪费资源
- 3次握手时,服务器会等到第三次握手,也就是客户端第二次发送报文后再进入连接已建立状态,这就可以避免上述的情况