前言:

  • 在网络发展的早期时代,网络技术的发展变化速度非常快,计算机网络变得越来越复杂,新的协议和应用不断产生,而网络设备大部分都是按厂商自己的标准生产,不能兼容,很难相互间进行通信。为了解决网络之间的兼容性问题,实现网络设备间的相互通讯,国际标准化组织ISO于1984年提出了OSI七层模型。由于种种原因,OSI参考模型只是法律上的国际标准,在当今世界上并没有大规模的使用,而TCP/IP模型在实际使用中得到了广泛应用

一、OSI七层模型

1、OSI 七层模型功能详情:

alt

2、OSI七层模型的失败原因
  • OSI 的专家缺乏实际经验,他们在完成 OSI 标准时缺乏商业驱动力
  • OSI 的协议实现起来过分复杂,而且运行效率很低
  • OSI 制定标准的周期太长,因而使得按 OSI 标准生产的设备无法及时进入市场(20 世纪 90 年代初期,虽然整套的 OSI 国际标准都已经制定出来,但基于 TCP/IP 的互联网已经抢先在全球相当大的范围成功运行了)
  • OSI 的层次划分不太合理,有些功能在多个层次中重复出现。

OSI 七层模型虽然失败了,但是却提供了很多不错的理论基础。为了更好地去了解网络分层,OSI 七层模型还是非常有必要学习的。

二、TCP/IP四层模型

  • 需要注意的是,我们并不能将 TCP/IP 四层模型 和 OSI 七层模型完全精确地匹配起来,不过可以简单将两者对应起来,如下图所示: alt
1、应用层
  • 应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。
  • 应用层协议定义了网络通信规则,对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如支持 Web 应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。
2、传输层
  • 传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。运输层主要使用以下两种协议:

    • 传输控制协议 TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。
    • 用户数据协议 UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
3、网络层
  • 网络层负责为分组交换网上的不同主机提供通信服务。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。

  • 网络层的还有一个任务就是选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。

4、网络接口层
  • 我们可以把网络接口层看作是数据链路层和物理层的合体。
  • 数据链路层(data link layer)通常简称为链路层( 两台主机之间的数据传输,总是在一段一段的链路上传送的)。数据链路层的作用是将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
  • 物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异

三、TCP、UDP协议区别和联系

1、联系
  • TCP、UDP协议,都工作在传输层,目标都是在程序之间传输数据
2、区别
  • UDP 是基于非连接的,远地主机在收到 UDP 报文后,不需要给出任何确认,所以性能损耗小,对资源的占用也比较少。

  • TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP 的可靠体现在 TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,同时对系统资源要求较多。

3、适用场景
  • UDP 的特点是速度快,但是会产生丢包,适用于对实时性要求比较高,但是对少量丢包并没有太大要求的场景,比如:语音通话、视频直播等等
  • TCP 传输数据稳定可靠,适用于对网络通信质量要求较高的场景,一般用于文件传输、发送和接收邮件等

四、讲一下三次握手

  • 很熟悉的一张图

    alt

1、SYN
  • 是一个TCP协议报文中的标志比特位,可以理解为建立连接时使用的握手信号,SYN=1表示该报文段用来建立TCP连接
2、ACK
  • 是一个TCP协议报文中的标志比特位,如果ACK=1表示回复确认报文,即收到了连接请求并确认
3、seq:初始化序列号    ack:确认号
  • tcp协议为每一个连接建立一个发送缓冲区,发送缓冲区的每个字节都有序列号,被应答确认的序列号对应的数据会从发送缓冲区删除掉。
  • 发送数据时,会取一部分的数据组成发送报文,在报文的头部信息中会保存有序列号,长度
  • 接收端收到数据后,需要回复确认,回复确认的ack确认号=序列号 + 长度,eg:比如发送的数据的seq(序列号)为101,长度为50,此时ack=151
  • 通过序列号和确认号,发送端可以将数据切割成多端进行发送,接收端根据序列号和长度重组即可,有数据丢失的话也可以根据序列号进行重发 alt

4、再来看一下三次握手

alt

  • 1、客户端主动发出请求,SYN标志位为1,表示要建立TCP连接,同时seq=x,表示告诉服务器我的数据会从x的序列号开始往后面发
  • 2、服务端确认请求,SYN标志位为1,表示建立TCP连接,ACK=1表示收到了连接请求并确认,同时seq=y,表示告诉客户端我的数据会从y的序列号开始往后面发,ack=x+1,即告诉客户端你发的数据我收到了,你下一次发送的序列号应该是x+1
  • 3、客户端确认回复,ACK=1表示收到了连接请求并确认,同时seq=x+1,表示之前的序列号+ 1,ack=y+1,即告诉服务端你发的数据我收到了,你下一次发送的序列号应该是y+1
5、可以是两次握手吗?或者四次?五次?
  • 示例,客户端第一次发送请求,因为网络延迟,服务端未收到,所以客户端再次发送连接请求,服务端收到请求并回复,此时TCP连接建立了

    alt

  • 过了一会,刚刚延迟的请求发送过来了,此时服务端又建立了连接,不过此时客户端并不知情,而服务端则一直等待客户端发送数据,从而造成资源浪费

    alt

五、讲一下四次挥手

  • 又是熟悉的图

    alt

1、 FIN:
  • 是一个TCP协议报文中的标志比特位,标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
2、断开过程
  • 由客户端首先发起断开请求,第一次挥手客户端会发送一个报文,报文里面FIN标志位置为1,当服务端收到这个报文就知道了客户端想断开连接
  • 但是此时服务端不一定能做好准备,因为当客户端发起断开连接的请求后,对于服务端而言还极有可能有未发送完的消息,还需继续发送,所以此时对于服务端而言只能进行一个消息确认(第二次挥手),即告诉客户端我收到你要和我断开的请求了,但是我这边还可能没有做好准备,你需要等我一下,
  • 稍过片刻,服务端会继续发送一个断开连接的报文(第三次挥手),FIN位置1的报文,表示服务端已经做好断开连接的准备
  • 当这个报文发给客户端的时候,客户端同样要给服务端发送一个消息确认的报文(第四次挥手)