前端网络基础(2)

前端开发
2020年03月06日
690

TCP

TCP:传输控制协议(Transmission Control Protocol)

特点:面向连接(收/发数据前,必须要建立可靠的连接),而建立连接的基础就是三次握手

应用场景:在数据必须准确无误地收发的场景(如:HTTP请求、FTP文件传输、邮件收发…)

TCP/IP

TCP/IP协议组:提供点对点的连接机制,制定了数据封装、定址、传输、路由、数据接收的标准。

UDP

UDP:用户数据报协议(User Data Protocol)

特点:面向无连接(不可靠的协议,无状态的传输机制),无连接信息发送机制。

应用场景:无需确定通讯质量且要求速度快、无需确保信息完整(如:消息收发、语音通话、直播…)

优点:安全、快速、漏洞少(也能被攻击:UPD flood攻击)

缺点:不可靠、不稳定、容易丢包

只要双方的地址和端口号确定,就可以直接发送信息报文,但不保证一定收到或收到完整的数据。

TCP/IP三次握手

名词解释

标志位:数据包

  • SYN:Synchronize Sequence Number(同步序列编号)
  • ACK:Acknowledgement(确认字符)

状态:

  • LISTEN:监听TCP端口的连接请求(等待请求状态)
  • SYN-SENT:发送连接请求后等待匹配的连接请求(SYN已发送状态)
  • SYN-RECEIVED:在收到和发送一个连接请求后等待对方确认连接请求(等待确认状态)
  • ESTABLISHED:代表一个打开的连接,数据可以传输给用户(连接已完成状态)

过程

  1. 服务器处于侦听连接请求状态(LISTEN);
  2. 客户端发送SYN J包给服务器,客户端进入SYN-SENT状态;
  3. 服务器发送SYN K包和确认包ACK J + 1给客户端,服务器进入SYN-RECEIVED状态;
  4. 客户端发送确认包ACK K + 1给服务器,此时客户端进入ESTABLISHED状态 ;
  5. 服务器接收到客户端发送过来的确认包,进入ESTABLISHED状态。

图解

2-1三次握手.jpg

TCP/IP四次挥手

名词解释

  • FIN:finish(关闭连接)

状态:

  • FIN-WAIT-1:等待远程TCP连接中断请求
  • FIN-WAIT-2:等待远程TCP的连接中断请求
  • CLOSE-WAIT:等待从客户端发来的连接中断请求
  • LAST-ACK:等待原来发向远程TCP的连接中断请求的确认
  • TIME-WAIT:等待足够时间以确保远程TCP接收到连接中断请求的确认
  • CLOSED:连接已关闭

过程

  1. 客户端发送连接关闭报文(此时已经停止发送数据)(第一次挥手
    1. 报文首部:FIN = 1、序列号seq = u
    2. 此时,客户端进入中断等待1状态(FIN-WAIT-1
  2. 服务器收到连接关闭报文,并发送确认报文(表示已经接收到了中断的请求)(第二次挥手
    1. 报文首部:ACK = 1、序列号seq = vack = u + 1(确认FIN包)
    2. 此时,服务器进入关闭等待状态(CLOSE-WAIT
    3. 说明:连接半关闭状态,客户端无法再请求数据,但服务器如果还有数据要发送,客户端依然需要接收
  3. 客户端收到服务器的确认请求,客户端进入中断等待2状态(FIN-WAIT-2
    1. 服务器在这期间需要确认客户端所需的数据是否已经发送完毕,如没有则继续发送
  4. 服务器确认数据已经发送完毕后,向客户端发送连接关闭报文(第三次挥手
    1. 报文首部:FIN = 1ACK = 1、序列号seq = wack = u + 1(确认上一次数据包)
    2. 此时,服务器进入最后确认状态(LAST-ACK
  5. 客户端收到服务器的连接关闭报文后,发出确认报文(第四次挥手
    1. 报文首部:ACK = 1、序列号seq = u + 1ack = w + 1(确认上一次数据包)
    2. 此时,客户端进入时间等待状态(TIME-WAIT),等待2MSL
  6. 服务器接收到客户端发出的确认,立即进入TCP关闭状态(CLOSED),TCP连接结束
    1. TCP关闭,服务器要比客户端早一些

TIME-WAIT时长:2MSL(MSL:Maximum Segment Lifetime,最大报文生存时间)

MSL的值根据不同的情况而不同,一般是30秒、1分钟、2分钟。

等待2MSL的目的:保证客户端发送的最后一次确认报文能够发送到服务器,一旦报文丢失,服务器会认为是最后一次发送的FIN + ACK包(第三次挥手)没有被客户端接收到。此时,服务器会重新发送一次(再进行一次第三次挥手),而客户端可以在2MSLTIME-WAIT时间内收到后重新进行第四次挥手,并重启2MSL计时器。

图解

2-2四次挥手.jpg

为什么是四次挥手

第一次挥手的时候,发送了FIN包,服务器接收到以后,表示客户端不会再发送数据了,但还能接收数据。这时服务器先向客户端发送确认包,并且确认自己是否还有数据没有发送给客户端,这个确认阶段是CLOSE-WAIT,所以在中断等待2(FIN-WAIT-2)和CLOSE-WAIT的开始和结束需要各发送一个包,状态开始时向客户端发送的包是确认收到来自客户端的FIN包,状态结束时向客户端发送的是确认数据已经完整发送,所以是四次挥手。