阅读 142

TCP协议/UDP协议

TCP和UDP都工作在传输层.

  • 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。

TCP

三次挥手

传输过程中:

客户端向浏览器端请求连接:

    客户端请求连接        ------(发送SYN包)-->      服务端

    客户端              <----(发送SYN+ASK包) ---   服务端收到SYN包(允许建立连接)

    客户端收到SYN+ASK包  ----(发送ASK包)----->      服务端
    
    连接建立
复制代码

这三次发送/接受数据包的过程就叫三次握手

为什么要三次而不是两次?

这是防止已经失效的请求报文突然发送到客户端,造成请求重复

假设只有两次握手:

    客户端请求连接  ----(发送SYN包1)---->  服务端
复制代码

此时由于未知原因,SYN包1没有到达服务端,在网络节点中, 请求超时, 客户端重新发送SYN包2

    客户端请求连接  ----(SYN包2)(SYN包1)---->  服务端
复制代码

若服务端收到SYN包2后建立连接, 这时,

    客户端请求连接  ----(SYN包1)---->  服务端得到(SYN包2)允许连接
复制代码

                        (SYN包1)

客户端请求连接(连接1已建立)      <----(SYN包2+ACK包)----      服务端得到(SYN包2)(连接1已建立)
复制代码

若此时SYN包1又发送到了服务端 服务端会认为客户端又发起了一次请求连接.

客户端请求连接(连接1已建立)      <----(SYN包1+ACK包)----      服务端得到(SYN包1) (连接2已建立)
                                                                              (连接1已建立)
复制代码

显然,这会导致两边连接状态不一致,服务端认为有两个连接,而客户端认为只有一次连接

如果是三次握手,服务端收不到客户端发的最后的ACK包,自然连接1就不会建立成功.

这就保证了传输过程中在不可靠的的信道上建立可靠的连接

发送数据时,如何处理丢包问题和乱序问题?

连接建立成功后,TCP协议为每一个链接都建立了一个发送数据的缓冲区, 将发送的报文放入缓冲区,并为他们排序:

例如: 从报文的第一个字节序号为0,第二个字节序号为2,以此类推,对发送的数据进行排序,

数据发送时:从缓冲区取出一段数据如: 序号为0-100的数据,并将其与该段数据长度一起放入TCP协议头中.

当服务端收到数据后回复一条由数据序号和数据长度组成的 ACK,表明已经收到该数据包并告知下一段数据发送的序列号

这一问一答的方式,保证了数据传递完整性.

假设 接收数据结束,服务端 校验时发现缺少数据,会向客户端发送一段缺失的数据包ACK,

客户端收到后会重新发送该数据包.

以上过程服务端客户端反过来依然试用.

四次挥手

假设 客户端主动请求断开连接

第一次挥手:

    客户端 ---(发送FIN包)---> 服务端 
     (等待关闭1)
复制代码

第二次挥手:

    客户端 <---(ACK包(同意关闭))--- 服务端 (收到FIN包)
    (等待关闭1)                    (等待关闭1)
复制代码

此时,双端仍然可以传输数据

第三次挥手(双端传输完成数据之后):

    客户端 <---(发送FIN包)--- 服务端(即将关闭连接等待确认) 
     
复制代码

第四次挥手:

    客户端 ---(发送ACK包)---> 服务端(收到后ACK包确认立即关闭) 
      (超时等待后关闭)
     
复制代码

为什么要经过超时等待?

这是因为,如果客户端发送ACK包后立即断开连接,一旦ACK包在网络中丢失, 服务器将一直处于等待状态, 无法关闭连接. 此时:若服务端没有收到客户端发送的ACK包,会重新发送FIN包询问是否关闭连接

UDP协议

UDP协议与TCP协议不同,发送数据时,直接将数据包发出,不需要确认连接,与数据完整性.

这个特点使UDP协议传输数据非常快,但是丢包风险也相对较高.

UNP与TCP适用场景

  • TCP协议保证了数据传输的完整性,所以适合用于对数据完整要求较高的场景,例如: 下载影视,文件传输,浏览网页等
  • UDP协议消耗性能少,传输速度快,适用于对实时性 要求高,能容忍少量丢包的场景,例如:打电话,视频通话,网络直播等场景.
文章分类
前端
文章标签