TCP 的三次握手:
在搞懂三次握手前,必须要搞明白TCP报头的结构内容
TCP报头结构:
- 源端口号 : 源计算机上的应用程序的端口号;
- 目的端口号 : 目标计算机的应用程序端口号;
- 序列号:客户端给服务端发送数据时,给分好的数据段在发送时标上一个序号,方便后面对数据段的排序;
- 确认序列号:接收方给发送方返回一个确认序号,就代表确认序号之前的数据接收方已经接收到了,同时接收方告诉发送方接下来可以发送之后的数据;
- 标志位:
- URG:紧急标记位,表示本报文段中发送的数据是否包含紧急数据,URG=1 时激活后面的紧急指针字段;
- ACK:确认标记位,当 ACK=1 时,激活前面的确认号字段,TCP 规定,连接建立后,ACK 必须为 1;
- PSH:告诉对方收到该报文段后是否立即把数据推送给上层,PSH=1,表示应当立即把数据提交给上层,而不是缓存起来;
- RST:该位为1时代表TCP连接出现了异常,强制断开连接;
- SYN:请求标记位,SYN=1 时表示想建立连接;
- FIN:结束标记位,表示请求断开连接.;
- 窗口大小:示当前接收端的接收窗口还有多少剩余空间;
- 校验和:它用于确认传输的数据是否有损坏,发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值,两个值必须相同,才能证明数据是有效的,如果两个值不同,则丢掉这个数据包
- 紧急指针:当 URG=1 时,激活紧急指针字段,它指出本数据段中为紧急数据的字节数,当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作;
- 选项:长度不定,但长度必须是 32bits 的整数倍;
三次握手:
目的:客户端和服务端要确认彼此都有收发数据的能力;
- 第一次握手:客户端发出连接请求,服务端收到连接请求,至此,
服务端知道客户端有发送能力
。 - 第二次握手:服务端收到第一次客户端发出的连接请求后,向其发出收到连接请求的响应和连接请求,至此,
客户端知道服务端有发送能力和接收能力
。 - 第三次握手:客户端收到服务端对它第一次所请求的回应后,发送收到连接请求的响应,服务端收到后,至此,
服务端知道客户端有接收能力
。
三次握手中标志位的详情:
- 第一次握手:客户端Client发送位码为SYN=1,随机产生seq=x的数据包到服务器,服务器Server由SYN=1知道,客户端Client要求建立联机;
- 第二次握手:服务器Server收到请求后要确认联机信息,向客户端Client发送ack=(客户端Client请求连接时的seq)+1,SYN=1,ACK=1,产生seq=y的包,代表接收到连接请求并且向客户端再次确认;
- 第三次握手:客户端Client收到后检查ack是否正确,即第一次发送的seq+1,以及位码ACK是否为1,代表收到了服务器端发过来的确认信息。之后客户端Client会再向服务器发送ack=(服务器Server的seq+1),ACK=1,服务器Server收到后确认ack 值与ACK=1,连接建立成功。
补充:三次握手四次断开的详解