一.TCP的三次握手
TCP 的三次握手是为了建立连接。
第一次握手:
- 客户端先向服务器发送一 个同步数据包(报文段)。
- 数据包的TCP首部内容:同步SYN=1,确认ACK=0,号seq=x。
- 根据TCP首部的内容,表示这是个请求建 立连接的数据包,期seq=x 为所传送数据的第一个字节的序号。
第二次握手:
- 服务器收到客户端发送的第一 个数据包后,根据SYN=1 与ACK=0 ,判断出为主动建立连接的数据包。
- 若服务器同意连接,则服务器发送一个数据包进行回应。
- 数据包的TCP首部内容:同步SYN=1,确认ACK=1,序号seq=y,确认号ack=x+1
- 确认ACK=1,代表服务器同意连接;
- 号seq=y的值由服务器指定,示服务器发送数据时的第一个数据字节的序号;
- 确认号! ack=x+1,表示已经收到客户端发送的x字节数据,并告诉客户端下次应从数据的第x+1 个字节开始发送;
第三次握手:
- 客户端收到服务器的确认之后,再给服务器发送一 个数据包。
- 数据包的TCP首部内容:同步SYN=0,确认ACK=1,序号seq=x+1,确认号ack=y+1
- SYN=0,示双方已同意建立连接;
- 确认ACK=1 ,示收到服务器的确认数据包;
- 号seq=x+1 ,表示发出的数据包就是数据的第x+1 个字节;
- 确认号ack=y+1 ,表示收到服务器发送y字节数据,并告诉服务器下次应从数据的第y+1 个字节开始发送。
?
二.TCP三次握手的原因
原因如下:
????????建立tcp连接的前两次握手,一个是客户端向服务器发出建立连接的请求,另一次是服务器向客户端确认收到这个请求,这两次只能证明客户端与服务器之间的网络是通畅的,最后一次握手是为了让客户端确认收到服务器发送的数据,避免服务器等待造成资源浪费 。如果过于频繁会导致服务器停止响应。
举个🌰:
????????客户端先发出了一个建立请求的请求数据包,但是由于网络的原因,客户端在设定的超时时间内还未收到服务器的确认数据包,于是又发出第二次的建立链接的请求数据包,这一次网络通畅,数据包很快到达服务器,服务器确认后发送收到的数据包,又开始接下来的数据传递。但是这个时候客户端第一次发出的建立请求的请求数据包到达了服务器,服务器会向向客户端发送确认数据包,由于客户端已经收到了一个确认数据包,所以会忽略服务器发来的第二个确认数据包。但服务器发出确认数据包就一直等待客户端的回复,这就造成服务器的无效等待以及资源浪费。
|