关于分布式:简约而不简单的分布式通信基石

48次阅读

共计 2261 个字符,预计需要花费 6 分钟才能阅读完成。

分布式系统能够总结为是处于不同物理地位的多个过程组成的整体,为了确保这个整体无效并且高效的对外提供服务,每个节点之间都有可能须要进行通信来替换信息,而这个替换信息的过程少数应用的是 tcp 协定。tcp 协定是位于 ip 层之上的传输层协定,在这个传输层里有两个比拟重要的协定:tcp 和 udp。对于应用层的开发人员来说,用的最多的就是这两个协定,这也是一些面试官必问的知识点之一

无论是 tcp 还是 udp,都是建设在 ip+ 端口的规定之上,什么意思呢?也就是说采纳 tcp 和 udp 的过程都须要一个端口来读取和写入数据。

TCP 协定

tcp 协定是牢靠的协定,而且是面向连贯的,建设连贯的过程会通过三次握手。为什么会是三次握手而不是二次或者四次呢?

说到这个问题,能够形象出一个场景,怎么样能力确定一端是和另外一端互通的呢?其实很简略,一端发送给另一端的音讯能顺利给我回答,这就阐明两端是联通的。tcp 协定的三次握手恰好阐明了这一点,A 和 B 通信,只有三次握手,A 能失去 B 的回答,B 也能失去 A 的回答。

基于 ip 层发送的报文,在网络中是无奈确定是否正确达到对方的。tcp 协定在 ip 协定之上增加了一系列数据结构和算法来保障 tcp 的数据正确达到。

  1. tcp 的数据包是有编号的,这么做次要是为了解决程序问题,如果没有编号,对方怎么确定程序呢?另外一点,编号是为了发送方来确认哪些包曾经正确达到对方
  2. 当 tcp 的数据包被接管方接管,接管方须要发送确认包给发送方,发送方在接管到确认包之后会把对应的数据包做状态批改,因为每个数据包其实有超时机制,在超时之后,发送方会进行重试
  3. tcp 是面向字节流的,发送的时候发的是一个字节流,这是 tcp 本人的状态保护的事件。

说了这么多,其实能够把 tcp 看做是一个有状态的协定,它能够依据网络情况,对方接管状况等诸多因素来调整本人的发送状态。

UPP 协定

绝对于 tcp 协定来说,udp 要简略很多

  1. udp 协定不须要建设连贯,这就意味着发送方只有晓得对方的 ip 和端口,就能够发送,基于这一点能够做播送。

2.udp 协定不负责牢靠交付,因为它不像 tcp 协定那样有一堆的算法和数据结构来做保障。

  1. udp 是基于数据报模式的,一个一个的发,一个一个的接管。而且 udp 数据的发送不会依据因为网络环境的阻塞而扭转

udp 基于以上个性能够在网络环境比拟好或者对于丢包不敏感的利用中应用。udp 在舍弃了重传,程序等一些列个性之后,处理速度特地快,在一些不敏感然而实时性要求比拟高的场景中利用十分宽泛。

Socket

在有了 tcp 和 udp 协定之后,过程间通信的基石就有了。然而总不能每次通信本人都须要写 tcp 的三次握手等这些简单过程吧。为了屏蔽这些简单的过程,使通信程序简略,在 tcp 和 udp 协定之上,便形象进去了 socket 这个概念。

所谓套接字 (Socket),就是对网络中不同主机上的利用过程之间进行双向通信的端点的形象。一个套接字就是网络上过程通信的一端,提供了应用层过程利用网络协议替换数据的机制。从所处的位置来讲,套接字上联利用过程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口

socket 是辨别服务端和客户端的,本地的 socket 与近程的一个 socket 建设连贯的过程,其实就是 tcp 协定三次握手的过程。一旦 socket 连贯建设,就能够利用 socket 形象进去的 read 或者 write 办法来进行通信了。

socket 须要指定应用的 IP 协定,还须要指定应用的是 tcp 还是 udp 协定。基于 tcp 协定的服务端的 socket 须要 bind 一个端口来 listen 并且 accept 客户端的 socket 连贯。这也是服务端 socket 和客户端 socket 的一个区别。

对于 udp 来说,过程有点不一样。udp 是没有连贯的,一是不须要三次握手,二是不须要 listen 和 connect,然而依然须要 ip 和端口 bind,要不然远端的数据到来的时候,零碎会找不到接管程序的。UDP 是没有连贯状态的,因此不须要每次连贯都建设一组 Socket,而是只用一个 Socket,就可能和多个客户端通信。也正是因为没有连贯状态,每次通信的时候,调用 sendto 和 recvfrom,都须要传入 IP 地址和端口。

基于 tcp 的 socket 在内核中都有一个发送缓冲区和接收缓冲区,tcp 的双工工作模式以及 tcp 的滑动窗口就是依赖于这两个独立的 buffer 以及 buffer 的数据填充状态。接收缓冲区把数据缓存入内核之中,如果对应的利用始终没有调用 socket 的 read 办法进行数据读取,则此数据会始终被缓存在接收缓冲区中,如果接收缓冲区满了,便会告诉对方 socket,以调整对方 socket 的发送窗口大小,这就是滑动窗口的实现。如果对方依然继续发送数据,接管方在接收缓冲区没有被读取的状况下将抛弃后到的数据,这就是 tcp 的流量管制。对于 udp 来说,它没有真正的发送缓冲区,只有有数据就会发送,无论对方是否失常正确接管,这也是 udp 丢包的起因之一,然而 udp 的 socket 和 tcp 的 socket 一样都会有接收缓冲区,而且行为也一样。

写在最初

有的面试官吹水,号称 http 长连贯,这个说法其实是不精确的,长连贯和短连贯是针对 tcp 协定而言,http 只是建设在 tcp/ip 协定之上的应用层的一个协定。总体而言,tcp 和 udp 设计的数据结构和算法有很多,这里只是粗略的说了一下,有趣味的同学能够去钻研 tcp 协定那本书。

更多精彩文章

  • 分布式大并发系列
  • 架构设计系列
  • 趣学算法和数据结构系列
  • 设计模式系列

正文完
 0