分布式系统能够总结为是处于不同物理地位的多个过程组成的整体,为了确保这个整体无效并且高效的对外提供服务,每个节点之间都有可能须要进行通信来替换信息,而这个替换信息的过程少数应用的是tcp协定。tcp协定是位于ip层之上的传输层协定,在这个传输层里有两个比拟重要的协定:tcp和udp。对于应用层的开发人员来说,用的最多的就是这两个协定,这也是一些面试官必问的知识点之一
无论是tcp还是udp,都是建设在ip+端口的规定之上,什么意思呢?也就是说采纳tcp和udp的过程都须要一个端口来读取和写入数据。
TCP协定
tcp协定是牢靠的协定,而且是面向连贯的,建设连贯的过程会通过三次握手。为什么会是三次握手而不是二次或者四次呢?
说到这个问题,能够形象出一个场景,怎么样能力确定一端是和另外一端互通的呢?其实很简略,一端发送给另一端的音讯能顺利给我回答,这就阐明两端是联通的。tcp协定的三次握手恰好阐明了这一点,A和B通信,只有三次握手,A能失去B的回答,B也能失去A的回答。
基于ip层发送的报文,在网络中是无奈确定是否正确达到对方的。tcp协定在ip协定之上增加了一系列数据结构和算法来保障tcp的数据正确达到。
- tcp的数据包是有编号的,这么做次要是为了解决程序问题,如果没有编号,对方怎么确定程序呢?另外一点,编号是为了发送方来确认哪些包曾经正确达到对方
- 当tcp的数据包被接管方接管,接管方须要发送确认包给发送方,发送方在接管到确认包之后会把对应的数据包做状态批改,因为每个数据包其实有超时机制,在超时之后,发送方会进行重试
- tcp是面向字节流的,发送的时候发的是一个字节流,这是tcp本人的状态保护的事件。
说了这么多,其实能够把tcp看做是一个有状态的协定,它能够依据网络情况,对方接管状况等诸多因素来调整本人的发送状态。
UPP协定
绝对于tcp协定来说,udp要简略很多
- udp协定不须要建设连贯,这就意味着发送方只有晓得对方的ip和端口,就能够发送,基于这一点能够做播送。
2.udp协定不负责牢靠交付,因为它不像tcp协定那样有一堆的算法和数据结构来做保障。
- 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协定那本书。
更多精彩文章
- 分布式大并发系列
- 架构设计系列
- 趣学算法和数据结构系列
- 设计模式系列