从输入URL到页面加载完成的过程-TCP三次握手

从输入URL到页面加载完成的过程-TCP三次握手原文地址

在上篇文章中,通过DNS获取服务器端ip后,客户端组装数据准备发送请求,但是由于没有和服务端建立可靠的连接,所以需要通过TCP的三次握手建立连接:所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息,在socket编程中,客户端执行connect()时,将触发三次握手,即客户端是主动打开连接,服务端是被动打开连接。

1、第一次握手:

  • 客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。发送后客户端进入SYN_SEND(同步已发送)状态,等待服务器确认。注意报文不能携带数据。

    2、第二次握手:

  • 服务器收到请求报文段后,如同意建立连接,则向客户端发送确认。服务器发回确认包(ACK)应答,即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的ISN加1以,即ack=X+1,同时也为自己选择一个初始序号seq=y。注意报文也不能携带数据,TCP服务器进程进入SYN-RCVD(同步收到)状态。

    3、第三次握手:

  • TCP客户端进程收到服务端的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。发送报文段后,TCP连接已经简历,A进入ESTABLISHED(已建立连接)状态。

图:TCP三次握手简历连接

注意:为什么会有第三次握手,假设一种情况,客户端第一次发送请求连接报文,滞留在网络中,此时客户端又发送了一次,这次和服务端建立连接,操作完后并释放了连接。此时第一次发送的请求报文到达服务端,那么服务端发送同意连接,并等待客户端发来数据,此时客户端收到同意连接报文,因为操作已经执行过,所以丢弃这个报文。服务端会一直等待,那么就会浪费服务端的资源。

  • 补充一个SYN攻击:

    • 在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.

    • Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

  • Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击

netstat -ntp | grep SYN_RECV
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.

但是不能完全防范syn攻击。

到此大家应该了解到建立连接是多么的麻烦,需要经过三次发包,如果是网络延迟大的时候,请求的延迟将更加严重,那有一些什么办法进行优化呢?

把服务器放到离用户近的地方以减少往返时间;
尽最大可能重用已经建立的TCP连接。
还有一种就是简化建立连接的过程,就是TCP Fast Open草案,期待它早点实施吧

建立连接后,客户端就要向服务端发送请求页面的报文段了,那么这个请求是怎么封装成帧进行透明传输的呢?请看下篇组装数据包的过程。

文章目录
,