TCP/IP 协议族基础

Posted microhex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP 协议族基础相关的知识,希望对你有一定的参考价值。

概念

协议族的概念是一系列协议所组成的一个网络分层模型

分层的缘由

因为网络的复杂性,存在各种坑,分层的意义就是为了更高效率和更小失败率来传输数据。

具体分层

应用层

Application Layer(应用层),直接与用户进行对接,负责的是具体的逻辑,比如文件传输、网络管理等。我们将它们一一抽象成各种协议:HTTP、FTP、SMTP、DNS等协议。我们平时使用浏览器进行的网络请求,就是直接使用HTTP协议;文件传输就是直接FTP。

传输层

Transport Layer(传输层),应用层使用各种协议,需要将数据发送到目标主机。传输层就是引用层所所需要发送或者接收的数据,拆分或者组装成数据包然后发送出去。之所以要拆分成数据包,主要是为了传输的效率问题。举个例子:一个大数据包拆分成100个小数据包,目标主机有几个数据包没有接收到,只需要重传没有收到的小数据包就行了,没有必要重传前部数据包。主要存在两个协议:TCP协议和UDP协议。

网络层

Internet Layer(网络层),传输层分拆过来的数据包,需要经过网络层转发到目标主机。由于一般两台主机之间存在很多个中间节点,有N多交换机,M多路由器。网络层就是通过某种算法来计算传输数据包通过的路劲,从而形成网络拓扑连接。主要协议有IP协议和ICMP协议。

数据链路层

Link Layer(数据链路层),网络层IP协议来回于各种节点,那么链路层的作用就是驱动硬件,使得数据包能在网线、光缆、光纤或者WIFI中传播。具象的,我们能感觉到的就有以太网、WIFI等等。

之所以要分层,除了重要的 为了传输效率,我想分层还是为了降低整体网络数据传输的难度,每个层独立负责自己的逻辑,出现错误也好分析错误的来源。

TCP/UDP差异

TCP

Transmission Control Protocol(传输控制协议),为应用程序提供可靠的、面向连接的、基于流的服务,具有超时重传、数据确认等方式来确保数据包能被正确的传送到目的端。因此TCP服务是可靠的,使用TCP协议通讯的双方必须先建立起TCP连接,并在系统内核中为该连接维持必要的数据结构,比如连接的状态、读写缓冲区、多个定时器等。当通讯结束时双方必须关闭连接以释放这些内核数据。基于流发送的意思是数据可以没有长度限制,可以源源不断的从一端流入到另一端。

UDP

User Datagram Protocol(用户数据报协议),为应用程序提供不可靠的、无连接的基于数据报的服务。
无连接: 通讯双方无法保持一个长久的联系,因为应用程序每次发送的数据都需要明确指明数据接收方的地址。
基于数据报的服务:相对于基于流服务而言,每一个UDP数据报文都存在长度,接收端必须以该长度为最小单位将其内容一次性读取,否则数据将会被截断。它也不存在数据重传的功能,所以系统内核中无需为它保持数据的副本,用完缓冲区即可清空。

TCP建立连接三次握手

连接的含义

通信双⽅建⽴确认「可以通信」,不会将对⽅的消息丢弃,即为「建⽴连接」。
握手的单位可以简单立即为,A向B发送了一条消息,这就是一次握手,如下图:

两次握手

既然我想证明连接的建立至少需要三次握手,那么就需要证明两次握手不行,一次握手更不行了。 一次握手很好证明,因为一次握手就相当于一次UDP协议,发送出去的数据就相当于泼出去的水,我都不知道有没有结果,就像你喜欢的妹子,频繁舔狗最后一无所依。那两次握手不行吗?

看上去可行啊,client端和server端都建立了通信的,那为什么两次握手不可以呢? 不卖关子了,我们试想一下比较复杂的一点的情况:

假设client端发送了两条数据,第一条数据由于某些原因延迟达了5分钟,此时client端以为server端没有接收到,然后发送了第二蓝色的数据,蓝色的数据server端接收了,并且很及时响应了client端,此时client端和server端经过了两次握手,建立了连接。并进行了通信。然而此时事情发生了转机,第一次绿色的消息此时达到了Server端,而此时client端已经和server端建立了连接,那么server将会认为这又是一个新的连接报文,此时将再次响应client端,发送一个响应报文给client端,但是client端认为自己已经没有建立连接的报文,因此忽略掉了这条消息;但是server认为新的连接连接起来了(的确已经建立起来了,但是是第二条报文建立的),所以将会一直等待,等到地老天荒,然后资源浪费,gg了。
   但是如果换成三次握手,则不会存在上面的情况。那么三次握手,是哪三次呢?如下图所示:

大致可以概括三个步骤:

  1. 第一次握手,确定连接报文;
  2. 第二次握手,服务端给客户端发送确认报文;
  3. 第三次握手,客户端给服务端发送确认报文。

相比两次握手,三次握手增加了一个客户端再次向服务端确认的报文,那么我们就可以通过这个报文来做很多事情。

  1. 客户端第一次握手之后,如果没有收到服务端的响应报文,也就是没有第二次握手,那么在一定时间内,客户端将会放弃等待,取消本次连接,重新来一个新的握手;
  2. 服务端第二次握手,将会给客户端发送一个确认连接的报文,如果此时客户端没有在规定时间内获取到客户端发过来的确认报文,那么服务端将会断开此次连接,认为握手不成功,从而避免上面的两次握手,从而造成的资源浪费。

至于为啥不是四次五次握手,那是因为既然三次就够了,那4,5次不就是浪费了吗?是吧。

长连接

对于移动网络并不在Internet中而是在运营商的内网中,并不是具有真正的公网IP,因此当某个TCP连接一段时间不通信之后,网关会出于网络性能考虑而关闭这条TCP连接和公网的连接通道,到这这个TCP端口不能再收到外部通信消息,即TCP连接被动关闭。

一般需要使用心跳即在⼀定间隔时间内,使⽤ TCP 连接发送超短⽆意义消息来让⽹关不能将⾃⼰定义为「空闲连
接,从⽽防⽌⽹关将⾃⼰的连接关闭。

以上是关于TCP/IP 协议族基础的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP协议族

HTTP基础之 TCP/ IP 协议族

IP报文详解

Java TCP/IP SocketTCP Socket(含代码)

TCP/IP报文头部结构

TCP/IP 协议族基础