——这个系列是对自己最近复习的知识点的总结,便于快速回顾记忆,如果有帮助,不妨点个赞哈!
客户端在访问服务器资源时候需要发送http请求,http是属于tcp(3.0之前)请求发送之前是要建立连接的。链接就要经过三次握手与四次挥手的。
在分析链接过程之前,首先来看一下下面这张图
这是tcp报文头部格式(tcp报文分为头部与载荷),下面会用到,这里只提一下序号,确认号,以及下面的标志号。
- 序号,客户端或者服务端数据载荷的开头序号。
- 确认号,客户端或者服务端喜欢收到对方的数据序号,也是对之前发送过来数据的确认。
- 标志ACK,只有ACK为1是确认号才生效。(建立连接之后ACK均为1)
- 标志SYN,是在tcp建立连接时候(三次握手)用于确认双方序号。 标志FIN,表明是tcp连接释放报文段。
那么下面进入正题。
接着看如下两幅图;
三次握手
- 初始阶段两者均处于关闭状态
- 首先客户端主动打开请求,服务端进入被动等待状态。
- 第一次握手,报文中标志符SYN=1,表明这是握手过程,用于客户端确认序号,seq(就是序号位对应上文)。客户端进入syn-sent 状态
- 第二次握手,报文中SYN=1,表明这是握手过程,用于确认服务端序号,ack(就是确认号位),这里标志ACK也要置为1,要使确认号生效。服务端进入syn-rcvd状态
- 第三次握手,同样发出确认号,序号,标志ACK要置为1,第二次握手后客户端进入连接建立状态,收到之后服务端进入连接建立状态。
那么根据流程,明明两次握手都已经确认好双方都序号了,为什么还要第三次握手呢?
这里实际是对第二次握手的确认,因为服务端无法确认客户端是否收到了自己的报文。突然想到了一个哲学问题就是。
试想一个场景,黑客采用伪造一堆ip 地址,仿造第一次握手发起请求,这是客户端接收到请求,如果是两次握手,进入建立状态,此时因为这些是虚假ip 不会有后续,更不会结束,那么服务端一直处于占用资源状态。这就是syn洪范攻击,没有一点点回应就放弃吧。。。
四次挥手
- 初始阶段双方都在连接状态。
- 客户端提出要断开连接,并发送序号,来确认号明确双方传递数据的位置。标志位FIN=1,说明是要释放连接。ACK=1,要使确认位生效(下文不再提及,但都是1);
- 服务端收到请求进入close-wait状态,开始第二次挥手发送确认号,序号。客户端收到之后进入fin-wait-2状态。
- 因为发送数据是双向的,关闭也是双向的,客户端进入等待之后,还得等到服务端提出关闭,因为中间可能有没发完的数据。
- 待发完之后服务端进行第三次挥手,四次握手 都是序号,确认号的发送。
为什么是四次呢,应该他们是双向(奔赴)的都有两方都要去确认关闭。
观察上图在第四次挥手发出之后,客户端等待两个msl 在关闭有必要吗。有,这里是为了防止网络错误,服务端收不到,客户端已经关了,服务端一直处于last-ack状态一直在超时重传,如果采用这种方式,可以确保客户端这边后续收到服务端的超时重传,继续进行第四次握手。(客户端说我等你一起关闭哈~)