每天进步一点点!
1. 先看下tcp握手示例图:
2. 几个字段含义:
- SYN要建立连接就要带它,无论是客户端对服务端还是服务端要对客户端建立连接;
- seq序列号,客户端第一次对服务端发起连接和服务端第一次回复客户端时,这个字段都是要生成随机数;
- ACK和ack是成对出现的,表示对上一条报文的应答,ACK=1表示确认号字段有效,即确认报文,ack值就是收到的上一条报文值+1,可以这样理解,ACK表示收没收到,ack表示具体收到了多少数值。
3. 握手过程:
第一次握手:
客户端:想要跟服务端建立连接,就要带着SYN,然后在生成个随机数seq发过去
第二次握手:
服务端:哎呀客户端来信了,带了SYN=1过来,要跟我建立连接,好的,我也同意建立连接,准备发信息给她;我带个SYN=1,然后告诉她我收到了它的信序列号是i,所以带ACK=1和ack=i+1,下次在给我写信他就知道从i+1开始写了;然后我在生成个随机序列号seq=j 传过去
第三次握手:
客户端:好了,我收到你的请求了,我要跟回信跟你确认,我已经收到请求,ACK=1,ack=j+1,你下次传j+1给我就行了,我们已经可以开始全双工通信了!
4. 为什么三次握手,不是两次
4.1. 主要是为了防止已经过期失效的连接请求报文突然又传送到了服务器,从而导致不必要的错误和资源的浪费。
考虑这样一种情况:
- 客户端发送了一个连接请求给服务器端,但是由于某些原因导致连接建立的报文在网络中滞留了很长时间,而客户端却认为连接建立失败了,于是重新发送了一个新的连接请求。
- 如果只有两次握手,那么这时候滞留在网络中的旧连接请求报文到达了服务器端,服务器端会误以为这是一个新的连接请求,从而建立了一个旧的无效连接。
- 通过三次握手,可以避免这种情况的发生。因为客户端可以识别无效的请求。客户端会检查接收到的数据包中的序列号和确认号等信息,如果发现这些信息与当前连接不匹配,或者与之前关闭的连接相关,客户端会忽略这些数据包,不对其进行处理。
4.2. 两次握手只能保证单向连接是畅通的,无法保证双方都同意建立连接。
因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。
5. 为什么不是四次握手
大可不必!三次都能搞定你为啥要多一次!