IP、TCP、UDP

230 阅读6分钟

一、传输数据包

                             TCP/IP五层模型

在网络中,我们传输资源并不是整个文件传输过去,而是会将资源拆分成很多个数据包去传输,那么一个数据包在网络中的传输过程是什么样的呢?我们通过对比一下这三种协议来看一下:

1、IP协议

数据包在网络中传输时,要知道接收包的计算机地址才能正确的传输,就像是你寄一封信,必须要知道收件人的地址,才能将信成功寄到,而计算机的地址正是ip。

数据包利用IP传输数据包的过程如下:

  • 数据包在网络层加上IP头,组成新的IP数据包,并向下传递。这个IP头中包含有目标IP、源IP。
  • 底层通过物理层将数据传输给目标主机。
  • 目标主机在接收到该IP数据包之后,会在网络层对数据包的IP头进行拆分,获得IP信息,和拆分之后的数据包,并将新的数据包传递给上层。

但是,IP地址标识的只是这个计算机的地址,我们的计算机或者移动设备上有那么多程序,怎么知道这个数据包要给哪个程序呢,别着急,我们先来分析一下UDP和TCP。

2、UDP

UDP全称是用户数据包协议,面向报文,无连接的传输协议。UDP头中就包含有端口信息,即目标端口、源端口。每一个想要访问网络的程序都有一个属于自己的端口,通过UDP中的端口号就能知道要将数据包发送给哪个程序了,具体的过程如下(参照TCP/IP模型):

  • 当主机A要发送一个数据包给主机B时,先通过应用层给该数据包加上协议信息,然后向下传递给传输层。
  • 传输层接收到之后,会给该数据包加上UDP头,并向下传递给网络层。UDP头中包含了源端口、目标端口、数据包长度,校验值,可以准确的知道要发给目标主机的哪个程序。
  • 网络层接收加工之后的数据包后,再加上IP头,并向下传递。IP头中包含有源主机IP、目标主机IP,数据包就能准确的发送到目标主机。
  • 目标主机在接收到该数据包之后,按照网络层到传输层的顺序,提取出ip地址和端口就可以了

使用UDP的数据包时,虽然可以检验数据是否正确,但是并不提供重发机制,只会丢弃当前的数据包,所以UDP可以使用在像视频、游戏等不严格要求数据的完整性,但要求传输速度够快的领域。

缺点:

  • 数据包容易丢失,并且不支持重发,会将出错的包丢掉。
  • 大文件在传输时,会被拆分成多个小的数据包,并且这些数据包是通过不同的路由,不同的时间到达接收端的,而UDP并不知道如何将这个拆分之后的小的数据包进行组装,拼成完整的数据。

优点:

  • 传输速度快。

3、TCP

在一些严格要求数据完整性的场合,UDP就不适用了,比如邮件,数据包丢失,邮件信息就完整,这是不行的,所以我们就引入了TCP(传输控制协议),它是一种可靠的、面向链接的、基于字节流的传输层通信协议。它的数据包传输过程如下:

  • 数据包在应用层加上协议,交给传输层。
  • 传输层接到之后,加上TCP头,再交给下层的网络层。TCP头中有源端口、目标端口、还有用于对数据包排序的序列号。
  • 网络层接收到之后加上IP头,再向下层传递。
  • 目标主机在接收到网络中传输过来的数据包之后,会现在传输层拆分出TCP头,再将数据包传给上层。

优点:

  • 传输数据时可靠的,不允许数据包的丢失或者出错,也就是支持重传机制,当发送方放松一个数据包给接收方之后,在规定时间内没有收到接收方的确认数据包时,就会判断数据包丢失,启动重发机制,重新给接收方发送该数据包。

  • 当一个大文件被拆分城多个小的数据包传输时,因为TCP头中有序列号,所以接收方在从传输层向应用层传递数据的时候,就已经将数据包的顺序排好,并且数据是完整的。

缺点:

  • 因为在建立连接之后,每发一个数据包都需要对方发一个确认数据包,所以传输过程中的数据包数量翻倍了。

  • 传输速度没有UDP快。

二、建立连接

1、UDP

UDP不用建立连接,因为UDP是面向非连接的,UDP属于直接将数据包发送给目标地址后,就什么都不管了,包括数据包是否已经发送到。

2、TCP

TCP是面向连接的,所以它需要建立连接,这个过程就是三次握手的过程。

那么,什么时候浏览器才会解析渲染接收到的文件呢?是等文件己收完毕吗?不是的,当网络进程接收到响应的header中的content-type这个字段的时候,就开始解析渲染文件了。

断开连接:

在时间等待这个阶段,TCP连接还没有释放掉,必须要经过2MSL才会释放掉,MSL叫做最长报文段寿命,建议设置2分钟。

  • 三次挥手行不行?

不行。如果改为三次挥手,也就是直接发送一个FIN包给客户端,那么此时可能还有数据没有发送完,所以不能三次。

  • 为什么要有时间等待?

  • 确保最后一个ACK包发送到服务器端。

  • 防止已失效的请求连接报文段出现在本连接中。让本连接中的所有请求报文段都消失,不会影响下一个连接。

**已失效的请求连接报文段:**当客户端发起一个请求连接A,由于网络延迟等原因造成A请求连接报文段没有及时到达服务器端,客户端没有收到服务器端的确认报文段,就再次发送一个连接请求B,服务器收到了,并和客户端建立了连接,传输完数据之后释放了连接B,但此时A连接的报文段也到达了服务器,服务器就以为是新的请求连接,就同意了,但是A其实已经失效了,所以不会给服务器发数据,服务器还一直在等待,浪费了资源。