科技 > 操作系统 > Unix

板凳---------unix网络编程卷1:第二章传输层:TCP、UDP 和 SCTP

157人参与 2024-08-06 Unix

2.1 概述

焦点是传输层,包括tcp、udp和sctp(stream control transmission protocol,流控制传输协议)。绝大多数客户/服务器网络应用使用tcp或udp。sctp是一个较新的协议,最初设计用于跨因特网传输电话信令。这些传输协议都转而使用网络层协议ip:或是ipv4,或是ipv6。绕过传输层直接使用ipv4或ipv6,称为原始套接字。

udp是一个简单的、不可靠的数据报协议,
tcp是一个复杂、可靠的字节流协议。

sctp与tcp类似之处在于它也是一个可靠的传输协议,它还提供消息边界、传输级别多宿(multihoming)支持以及将头端阻塞(head-of-line blocking)减少到最小的一种方法。

2.2 总图

最左边名为tcpdump的网络应用或者使用bsd分组过滤器(bsd packet filter,bpf) 

使用数据链路提供者接口(datalink provider interface,dlpi)直接与数据链路进行通信。

在这里插入图片描述

ipv4  网际协议版本4(internet protocol version 4)。ipv4(通常称之为ip)它使用32位地址。ipv4给tcp、udp、sctp、icmp和igmp提供分组递送服务。 

i pv6 网际协议版本6(internet protocol version 6)。使用128位更大地址。ipv6给tcp、udp、sctp和icmpv6提
供分组递送服务。当无需区别ipv4和ipv6时,我们经常把“ip”一词作为形容词使用

tcp 传输控制协议(transmission control protocol)。tcp是一个面向连接的协议,为用户进程提供可靠的全双工字节流。tcp套接字是一种流套接字(stream socket)。tcp关心确认、超时和重传之类的细节。

udp 用户数据报协议(user datagram protocol)。udp是一个无连接协议。udp套接字是一种数据报套接字(datagram socket)。udp数据报不能保证最终到达它们的目的地。 

sctp 流控制传输协议(stream control transmission protocol)。sctp是一个提供可靠用户数据报协议(udp)全双工关联的面向连接的协议,我们使用“关联”一词来指称sctp中的连接,因为sctp是多宿的,从而每个关联的两端均涉及一组ip地址和一个端口号。sctp提供消息服务,也就是维护来自应用层的记录边界。

icmp 网际控制消息协议(internet control message protocol)。icmp处理在路由器和主机之间流通的错误和控制消息。这些消息通常由tcp/ip网络支持软件本身(而不是用户进程)产生和处理。 

igmp 网际组管理协议(internet group management protocol)。igmp用于多播,它在ipv4中是可选的。 

arp 地址解析协议(address resolution protocol)。arp把一个ipv4地址映射成一个硬件地址(如以太网地址)。arp通常用于诸如以太网、令牌环网和fddi等广播网络,在点到点网络上并不需要。 

rarp 反向地址解析协议(reverse address resolution protocol)。rarp把一个硬件地址映射成一个ipv4地址。它有时用于无盘节点的引导。 

icmpv6 网际控制消息协议版本6(internet control message protocol version 6)。icmpv6 综合了icmpv4、igmp和arp的功能。

bpf bsd分组过滤器(bsd packet filter)。该接口提供对于数据链路层的访问能力,通常可以在源自berkeley的内核中找到。 

dlpi 数据链路提供者接口(datalink provider interface)。该接口也提供对于数据链路层的访问能力,通常随svr4内核提供。

所有网际协议由一个或多个称为请求评注(request for comments,rfc)的文档定义,这些rfc就是它们的正式规范。

2.3 用户数据报协议(udp)

udp是一个简单的传输层协议。应用进程往一个udp套接字写入一个消息,该消息随后被封装(encapsulating)到一个udp数据报,该udp数据报进而又被封装到一个ip数据报,然后发送到目的地。udp不保证udp数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。

是它缺乏可靠性

每个udp数据报都有一个长度。

udp提供无连接的(connectionless)服务,因为udp客户与服务器之间不必存在任何长期的关系。

2.4 传输控制协议(tcp)

首先,tcp提供客户与服务器之间的连接(connection)。tcp客户先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接。 

其次,tcp还提供了可靠性(reliability)。当tcp向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,tcp就自动重传数据并等待更长时间。在数次重传失败后,tcp才放弃,如此在尝试发送数据上所花的总时间一般为4~10分钟。

tcp也不能被描述成是100%可靠的协议,它提供的是数据的可靠递送或故障的可靠通知。

tcp含有用于动态估算客户和服务器之间的往返时间(round-trip time,rtt)的算法,以便它知道等待一个确认需要多少时间。

tcp通过给其中每字节关联一个序列号对所发送的数据进行排序(sequencing)。分节是tcp传递给ip的数据单元。

再次,tcp提供流量控制(flow control)。tcp总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口(advertised window)。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化:当接收到来自发送端的数据时,窗口大小就减小,但是当接收端应用从缓冲区中读取数据时,窗口大小就增大。通告窗口大小减小到0是有可能的:当tcp对应某个套接字的接收缓冲区已满,导致它必须等待应用从该缓冲区读取数据时,方能从对端再接收数据。

最后,tcp连接是全双工的(full-duplex)。这意味着在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。

2.5 流控制传输协议(sctp)

sctp在客户和服务器之间提供关联(association),并像tcp那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。sctp中使用“关联”一词取代“连接”是为了避免这样的内涵:一个连接只涉及两个ip地址之间的通信。一个关联指代两个系统之间的一次通信,它可能因为sctp支持多宿而涉及不止两个地址。

sctp是面向消息的(message-oriented)。它提供各个记录的按序递送服务。与udp一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。sctp能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。tcp正好相反,在单一字节流中任何位置的字节丢失都将阻塞该连接上其后所有数据的递送,直到该丢失被修复为止。 

sctp还提供多宿特性,使得单个sctp端点能够支持多个ip地址。该特性可以增强应对网络故障的健壮性。一个端点可能有多个冗余的网络连接,每个网络又可能有各自接入因特网基础设施的连接。当该端点与另一个端点建立一个关联后,如果它的某个网络或某个跨越因特网的通路发生故障,sctp就可以通过切换到使用已与该关联相关的另一个地址来规避所发生的故障。 

2.6 tcp 连接的建立和终止

2.6.1 三路握手

在这里插入图片描述

建立一个tcp连接时会发生下述情形。 

(1) 服务器必须准备好接受外来的连接。这通常通过调用socket、bind和listen这3个函数来完成,我们称之为被动打开(passive open)。 

(2) 客户通过调用connect发起主动打开(active open)。这导致客户tcp发送一个syn(同步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。通常syn分节不携带数据,其所在ip数据报只含有一个ip首部、一个tcp首部及可能有的tcp选项。 

(3) 服务器必须确认(ack)客户的syn,同时自己也得发送一个syn分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送syn和对客户syn的ack(确认)。 

(4) 客户必须确认服务器的syn。 

这种交换至少需要3个分组,因此称之为tcp的三路握手(three-way handshake)。

客户的初始序列号为j,服务器的初始序列号为k。ack中的确认号是发送这个ack的一端所期待的下一个序列号。因为syn占据1字节的序列号空间,所以每一个syn的ack中的确认号就是该syn的初始序列号加1。类似地,每一个fin(表示结束)的ack中的确认号为该fin的序列号加1。

2.6.2 tcp 选项

mss选项。发送syn的tcp一端使用本选项通告对端它的最大分节大小(maximumsegment size)即mss,也就是它在本连接的每个tcp分节中愿意接受的最大数据量。发送端tcp使用接收端的mss值作为所发送分节的最大大小。

窗口规模选项。tcp连接任何一端能够通告对端的最大窗口大小是65535,因为在tcp首部中相应的字段占16位。

时间戳选项。这个选项对于高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据损坏。

2.6.3 tcp 连接终止

在这里插入图片描述

tcp建立一个连接需3个分节,终止一个连接则需4个分节。 

(1) 某个应用进程首先调用close,我们称该端执行主动关闭(active close)。该端的tcp于是发送一个fin分节,表示数据发送完毕。 

(2) 接收到这个fin的对端执行被动关闭(passive close)。这个fin由tcp确认。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为fin的接收意味着接收端应用进程在相应连接上再无额外数据可接收。 

(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的tcp也发送一个fin。 

(4) 接收这个最终fin的原发送端tcp(即执行主动关闭的那一端)确认这个fin。

2.6.4 tcp 状态转换图

在这里插入图片描述

tcp为一个连接定义了11种状态,并且tcp规则规定如何基于当前状态及在该状态下所接收的分节从一个状态转换到另一个状态。

自established状态引出的两个箭头处理连接的终止。如果某个应用进程在接收到一个fin之前调用close(主动关闭),那就转换到fin_wait_1状态。但如果某个应用进程在established状态期间接收到一个fin(被动关闭),那就转换到close_wait状态。

用粗实线表示通常的客户状态转换,用粗虚线表示通常的服务器状态转换。两个转换:一个为同时打开(simultaneous open),发生在两端几乎同时发送syn并且这两个syn在网络中交错的情形下,另一个为同时关闭(simultaneous close),发生在两端几乎同时发送fin的情形下。

2.6.5 观察分组

展示一个完整的tcp连接所发生的实际分组交换情况,包括连接建立、数据传送和连接终止3个阶段。

客户通告一个值为536的mss(表明该客户只实现了最小重组缓冲区大小),服务器通告一个值为1460的mss(以太网上ipv4的典型值)。

在这里插入图片描述

一旦建立一个连接,客户就构造一个请求并发送给服务器。假设该请求适合于单个tcp分节(即请求大小小于服务器通告的值为1460字节的mss)。服务器处理该请求并发送一个应答,假设该应答也适合于单个分节(本例即小于536字节)。图中使用粗箭头表示这两个数据分节。注意,服务器对客户请求的确认是伴随其应答发送的。这种做法称为捎带(piggybacking),它通常在服务器处理请求并产生应答的时间少于200 ms时发生。如果服务器耗用更长时间,譬如说1 s,那么我们将看到先是确认后是应答。

随后展示的是终止连接的4个分节。注意,执行主动关闭的那一端(本例子中为客户)进入我们将在下一节中讨论的time_wait状态。 

注意的是,如果该连接的整个目的仅仅是发送一个单分节的请求和接收一个单分节的应答,那么使用tcp有8个分节的开销。如果改用udp只需交换两个分组:一个承载请求,一个承载应答。tcp提供的另一个重要特性即拥塞控制也必须由udp应用进程来处理。仍然需要知道许多网络应用是使用udp构建的,因为它们需要交换的数据量较少,而udp避免了tcp连接建立和终止所需的开销。

2.7 time_wait 状态

到执行主动关闭的那端经历了这个状态。该端点停留在这个状态的持续时间是最长分节生命期(maximum segment lifetime,msl)的两倍,有时候称之为2msl。

tcp实现都必须为msl选择一个值。建议值是2分钟,传统上改用30秒这个值。这意味着time_wait状态的持续时间在1分钟到4分钟之间。msl是任何ip数据报能够在因特网中存活的最长时间。我们知道这个时间是有限的,因为每个数据报含有一个称为跳限(hop limit)的8位字段,它的最大值为255。尽管这是一个跳数限制而不是真正的时间限制,假设:具有最大跳限(255)的分组在网络中存在的时间不可能超过msl秒。 

分组在网络中“迷途”通常是路由异常的结果。某个路由器崩溃或某两个路由器之间的某个链路断开时,路由协议需花数秒到数分钟的时间才能稳定并找出另一条通路。在这段时间内有可能发生路由循环(路由器a把分组发送给路由器b,而b再把它们发送回a),分组可能就此陷入这样的循环。假设迷途的分组是一个tcp分节,在它迷途期间,发送端tcp超时并重传该分组,而重传的分组却通过某条候选路径到达最终目的地。然而不久后(自迷途的分组开始其旅程起最多msl秒以内)路由循环修复,早先迷失在这个循环中的分组最终也被送到目的地。这个原来的分组称为迷途的重复分组(lost duplicate)或漫游的重复分组(wandering duplicate)。tcp必须正确处理这些重复的分组。 

time_wait状态有两个存在的理由:

(1) 可靠地实现tcp全双工连接的终止; 

(2) 允许老的重复分节在网络中消逝。 

第一个理由可以通过查看并假设最终的ack丢失了来解释。服务器将重新发送它的最终那个fin,因此客户必须维护状态信息,以允许它重新发送最终那个ack。要是客户不维护状态信息,它将响应以一个rst(另外一种类型的tcp分节),该分节将被服务器解释成一个错误。如果tcp打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关 闭),那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。本例子也说明了为什么执行主动关闭的那一端是处于time_wait状态的那一端:因为可能不得不重传最终那个ack的就是那一端。 

理解存在time_wait状态的第二个理由,我们假设在12.106.32.254的1500端口和206.168.112.219的21端口之间有一个tcp连接。我们关闭这个连接,过一段时间后在相同的ip 地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的ip地址和端口号都相同。tcp必须防止来自某个连接的老的重复分组在该连接已终止后再现,从而被误解成属于同一连接的某个新的化身。为做到这一点,tcp将不给处于time_wait状态的连接发起新的化身。既然time_wait状态的持续时间是msl的2倍,这就足以让某个方向上的分组最多存活msl秒即被丢弃,另一个方向上的应答最多存活msl秒也被丢弃。通过实施这个规则,我们就能保证每成功建立一个tcp连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了。 

2.8 sctp 关联的建立和终止

建立一个sctp关联的时候会发生下述情形。 

(1) 服务器必须准备好接受外来的关联。这通常通过调用socket、bind和listen这3个函数来完成,称为被动打开。 

(2) 客户通过调用connect或者发送一个隐式打开该关联的消息进行主动打开。这使得客户sctp发送一个init消息(初始化),该消息告诉服务器客户的ip地址清单、初始序列号、用于标识本关联中所有分组的起始标记、客户请求的外出流的数目以及客户能够支持的外来流的数目。 

(3) 服务器以一个init ack消息确认客户的init消息,其中含有服务器的ip地址清单、初始序列号、起始标记、服务器请求的外出流的数目、服务器能够支持的外来流的数目以及一个状态cookie。状态cookie包含服务器用于确信本关联有效所需的所有状态,它是数字化签名过的,以确保其有效性。 

(4) 客户以一个cookie echo消息回射服务器的状态cookie。除cookie echo外,该消息可能在同一个分组中还捆绑了用户数据。 

(5) 服务器以一个cookie ack消息确认客户回射的cookie是正确的,本关联于是建立。该消息也可能在同一个分组中还捆绑了用户数据。 

交换过程至少需要4个分组,因此称之为sctp的四路握手(four-way handshake)。 

在这里插入图片描述

sctp的四路握手,差别主要在于作为sctp整体一部分的cookie的生成。

init(随其众多参数一道)承载一个验证标记ta和一个初始序列号j。在关联的有效期内,验证标记ta必须在对端发送的每个分组中出现。

初始序列号j用作承载用户数据的data块的起始序列号。对端也在init ack中承载一个验证标记tz,在关联的有效期内,验证标记tz也必须在其发送的每个分组中出现。

init的接收端还在作为响应的init ack中提供一个cookie c。该cookie包含设置本sctp关联所需的所有状态,这样服务器的sctp栈就不必保存所关联客户的有关信息。

四路握手过程结束时,两端各自选择一个主目的地址(primary destination address)。当不存在网络故障时,主目的地址将用作数据要发送到的默认目的地。 

sctp中使用四路握手是为了避免拒绝服务攻击。

2.8.2 关联终止

sctp没有类似于tcp的time_wait状态,因为sctp使用了验证标记。所有后续块都在捆绑它们的sctp分组的公共首部标记了初始的init块和init ack块中作为起始标记交换的验证标记;由来自旧连接的块通过所在sctp分组的公共首部间接携带的验证标记对于新连接来说是不正确的。因此,sctp通过放置验证标记值就避免了tcp在time_wait状态保持整个连接的做法。 

2.8.3 sctp 状态转换图

在这里插入图片描述

2.9 端口号

多个进程可能同时使用tcp、udp和sctp这3种传输层协议中的任何一种。这3 种协议都使用16位整数的端口号(port number)来区分这些进程。 

当一个客户想要跟一个服务器联系时,它必须标识想要与之通信的这个服务器。tcp、udp和sctp定义了一组众所周知的端口(well-known port),用于标识众所周知的服务。

支持ftp的任何tcp/ip实现都把21端口分配给ftp服务器。

分配给简化文件传送协议(trivial file transfer protocol,tftp)的是udp端口号69。 

客户通常使用短期存活的临时端口(ephemeral port)。这些端口号通常由传输层协议自动赋予客户。只需确信该端口在所在主机中是唯一的就行。传输协议的代码确保这种唯一性。 

iana(the internet assigned numbers authority,因特网已分配数值权威机构)维护着一个端口号分配状况的清单。

(1) 众所周知的端口为0~1023。这些端口由iana分配和控制。可能的话,相同端口号就分配给tcp、udp和sctp的同一给定服务。

(2) 已登记的端口(registered port)为1024~49151。这些端口不受iana控制,不过由iana 登记并提供它们的使用情况清单,以方便整个群体。

(3) 49152~65535是动态的(dynamic)或私用的(private)端口。iana不管这些端口。它们就是我们所称的临时端口。(49152这个魔数是65536的四分之三。)

套接字对

一个tcp连接的套接字对(socket pair)是一个定义该连接的两个端点的四元组:本地ip地址、本地tcp端口号、外地ip地址、外地tcp端口号。套接字对唯一标识一个网络上的每个tcp连接。

sctp而言,一个关联由一组本地ip地址、一个本地端口、一组外地ip地址、一个外地端口标识。在两个端点均非多宿这一最简单的情形下,sctp与tcp所用的四元组套接字对一致。

在某个关联的任何一个端点为多宿的情形下,同一个关联可能需要多个四元组标识(这些四元组的ip地址各不相同,但端口号是一样的)。 

标识每个端点的两个值(ip地址和端口号)通常称为一个套接字。

2.10 tcp 端口号与并发服务器

http的用法,用冒号来分割ip地址和端口号。

netstat 程序使用点号来分割ip地址和端口号,因为点号既用于域名(如freebsd.unpbook.com.21).

用于ipv4的点分十进制数记法(如12.106.32. 254.21)。 

2.11 缓冲区大小及限制

影响应用进程能够传送的数据进行综合分析。

ipv4数据报的最大大小是65 535字节,包括ipv4首部。总长度字段占据16位。 

ipv6数据报的最大大小是65 575字节,包括40字节的ipv6首部。其净荷长度字段占据16位。注意,ipv6的净荷长度字段不包括ipv6首部,而ipv4的总长度字段包括ipv4首部。ipv6有一个特大净荷(jumbo payload)选项,它把净荷长度字段扩展到32位,不过这个选项需要mtu(maximum transmission unit,最大传输单元)超过65 535的数据链路提供支持。 

许多网络有一个可由硬件规定的mtu。举例来说,以太网的mtu是1500字节。另有一些链路(例如使用ppp协议的点到点链路)其mtu可以人为配置。较老的slip链路通常使用1006字节或296字节的mtu。ipv4要求的最小链路mtu是68字节。这允许最大的ipv4首部(包括20字节的固定长度部分和最多40字节的选项部分)拼接最小的片段(ipv4首部中片段偏移字段以8字节为单位)。ipv6要求的最小链路mtu为1280字节。ipv6可以运行在mtu小于此最小值的链路上,不过需要特定于链路的分片和重组功能,以使得这些链路看起来具有至少为1280字节的mtu。 

在两个主机之间的路径中最小的mtu称为路径mtu(path mtu)。1500字节的以太网mtu是当今常见的路径mtu。两个主机之间相反的两个方向上路径mtu可以不一致,因为在因特网中路由选择往往是不对称的[paxson 1196],也就是说从a到b的路径与从b到a的路径可以不相同。 

当一个ip数据报将从某个接口送出时,如果它的大小超过相应链路的mtu,ipv4和ipv6 都将执行分片(fragmentation)。这些片段在到达最终目的地之前通常不会被重组(reassembling)。ipv4主机对其产生的数据报执行分片,ipv4路由器则对其转发的数据报执行分片。然而ipv6只有主机对其产生的数据报执行分片,ipv6路由器不对其转发的数 据报执行分片。

ipv4和ipv6都定义了最小重组缓冲区大小(minimum reassembly buffer size),它是ipv4或ipv6的任何实现都必须保证支持的最小数据报大小。其值对于ipv4为576字节,对于ipv6为1500字节。为此有许多使用udp的ipv4网络应用(如dns、rip、tftp、bootp、snmp)避免产生大于这个大小的数据报。 

tcp有一个mss(maximum segment size,最大分节大小),用于向对端tcp通告对端在每个分节中能发送的最大tcp数据量。mss经常设置成mtu减去ip和tcp首部的固定长度。在以太网中使用ipv4的mss值为1460,使用ipv6的mss值为1440(两者的tcp首部都是20字节,但ipv4首部是20字节,ipv6首部却是40字节)。

在tcp的mss选项中,mss值是一个16位的字段,限定其最大值为65 535。这对于ipv4是适合的,因为ipv4数据报中的最大tcp数据量为65 495(65 535减去ipv4首部的20字节和tcp首部的20字节)。

具有特大净荷选项的ipv6,却需要使用另外一种技巧 。

首先,没有特大净荷选项的ipv6数据报中的最大tcp数据量为65 515(65 535减去tcp首部的20字节)。65 535这个mss值于是被视为表示“无限”的一个特殊值。该值只在用到特大净荷选项时才使用,不过这种情况却要求实际的mtu超过65 535。

其次,如果tcp使用特大净荷选项,并且接收到的对端通告的mss为65 535,那么它所发送数据报的大小限制就是接口mtu。如果这个值太大,那么路径mtu发现功能将确定这个较小值。 

sctp基于到对端所有地址发现的最小路径mtu保持一个分片点。这个最小mtu大小用于把较大的用户消息分割成较小的能够以单个ip数据报发送的若干片段。sctp_maxseg 套接字选项可以影响该值,使得用户能够请求一个更小的分片点。 

2.11.1 tcp 输出

2.11.2 udp 输出

2.11.3 sctp 输出

2.12 标准因特网服务

2.13 常见因特网应用的协议使用

因特网应用ping和traceroute是使用icmp协议实现的网络诊断应用。

traceroute自行构造udp分组来发送并读取所引发的icmp应答。 

路由协议,它们展示了路由协议使用的各种传输协议。

ospf通过原始套接字直接使用ip,rip使用udp,bgp使用tcp。 

基于udp的网络应用,7个tcp网络应用和4个同时使用udp和tcp的网 络应用,最后5个是ip电话网络应用,它们或者独自使用sctp,或者选用udp、tcp或sctp。 

在这里插入图片描述
https://www.cnblogs.com/wyzhou/p/9311584.html
ip封包协议头/tcp协议头/tcp3次握手/tcp4次挥手/udp协议头/icmp协议头/http协议(请求报文和响应报文)/ip地址/子网掩码(划分子网)/路由概念/mac封包格式
https://www.cnblogs.com/wyzhou/p/9311584.html

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

无法使用docker|ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker

08-06

【gitlab】failed to receive response: dial unix /var/opt/gitlab/gitlab-rails/sockets/g

08-06

银河麒麟V10+达梦数据库DM8环境,安装UnixODBC驱动

08-06

Andorid进程间通信之 UNIX SOCKET

08-06

整理FreeBSD系统安装时关于硬盘参数提示的处理方法

09-08

Windows 安装 GCC

08-03

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论