计算机网络

一、计算机网络

1.OSI 七层模型

image-20221005105935050

osi七层模型2

img

  1. 为什么分七层

    支持异构网络的互联互通。

  2. 七层分别负责的内容(功能)

    OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层

    (1) 物理层

    任务:透明地传输比特流。

    功能:为数据段设备提供传送数据通路

    传输单位:比特

    所实现的硬件:集线器,中继器

    (2)数据链路层

    任务:将网络层传输下来的IP数据报组装成帧

    功能:a. 链路连接的建立、拆除和分离

    ​ b. 帧定界和帧同步

    ​ c.差错检测

    传输单位:帧

    所实现的硬件:交换机、网桥

    协议:PPP,HDLC、SDLC、STP、ARQ

    (3)网络层

    任务:a. 将传输层传下来的报文段封装成分组

    ​ b.选择合适的路由,使得传输层传下来的分组能够交付到目的主机

    功能:a. 为传输层提供服务

    ​ b. 组包和拆包

    ​ c. 路由选择

    ​ d.拥塞控制

    传输单位:数据段

    所实现的硬件:路由器

    协议:ICMP、ARP、RARP、IP、IGMP、OSPF

    (4)传输层

    任务:负责主机中两个进程之间的通信

    功能:

    ​ a. 为端到端连接提供可靠的服务

    ​ b. 为端到端连接提供流量控制、差错控制、服务质量等管理服务

    传输单位:报文段(TCP)或用户数据报(UDP)

    协议:TCP、UDP

    (5)会话层

    任务:不同主机上各进程间的对话

    功能:管理主机间的会话进程,包括建立、管理以及终止进程间的会话。是一种端到端的服务

    (6)表示层

    负责处理在两个内部数据表示结构不同的通信系统之间交换信息的表示格式,为数据加密和解密以及为提高传输效率提供必需的数据压缩以及解压等功能。

    (7)应用层

    任务:提供系统与用户的接口

    功能:

    ​ a.文件传输

    ​ b. 访问和管理

    ​ c. 电子邮件服务

    协议:FTP、SMTP、POP3、HTTP、DNS、TELnet

2.TCP/IP 四层模型

TCP/IP 四层模型 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本,由以下 4 层组成:

  1. 应用层
  2. 传输层
  3. 网络层
  4. 网络接口层

需要注意的是,我们并不能将 TCP/IP 四层模型 和 OSI 七层模型完全精确地匹配起来,不过可以简单将两者对应起来,如下图所示:

image-20221005113448686

应用层(Application layer)

应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。 我们把应用层交互的数据单元称为报文。

img

应用层协议定义了网络通信规则,对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如支持 Web 应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。

image-20221005113632428

传输层(Transport layer)

传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。 应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。

运输层主要使用以下两种协议:

  1. 传输控制协议 TCP(Transmisson Control Protocol)--提供 面向连接 的,可靠的 数据传输服务。
  2. 用户数据协议 UDP(User Datagram Protocol)--提供 无连接 的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

image-20221005113745228

网络层(Network layer)

网络层负责为分组交换网上的不同主机提供通信服务。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。

⚠️注意 :不要把运输层的“用户数据报 UDP”和网络层的“IP 数据报”弄混

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

这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称。

互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做 网际层IP 层

image-20221005113838937

网络层常见协议

  • IP:网际协议 :网际协议 IP 是TCP/IP协议中最重要的协议之一,也是网络层最重要的协议之一,IP协议的作用包括寻址规约、定义数据包的格式等等,是网络层信息传输的主力协议。目前IP协议主要分为两种,一种是过去的IPv4,另一种是较新的IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。
  • ARP 协议 :ARP协议,全称地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个IP数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但IP地址属于逻辑地址,而MAC地址才是物理地址,ARP协议解决了IP地址转MAC地址的一些问题。
  • NAT:网络地址转换协议 :NAT协议(Network Address Translation)的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,LAN)内,各主机使用的是同一个LAN下的IP地址,但在该LAN以外,在广域网(WAN)中,需要一个统一的IP地址来标识该LAN在整个Internet上的位置。

网络接口层(Network interface layer)

我们可以把网络接口层看作是数据链路层和物理层的合体。

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

3.请介绍五层网络体系结构。

五层网络体系结构分分别为:应用层、运输层、网络层、数据链路层、物理层。各层功能分别如下:

  1. 第五层——应用层(application layer)

    (1) 应用层(application layer):是体系结构中的最高。直接为用户的应用进程提供服务。

    (2) 在因特网中的应用层协议很多,如支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,支持文件传送的FTP协议等等。

  2. 第四层——运输层(transport layer)

    (1) 运输层(transport layer):负责向两个主机中进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层有复用分用的功能。

    a. 复用,就是多个应用层进程可同时使用下面运输层的服务。

    b. 分用,就是把收到的信息分别交付给上面应用层中相应的进程。

    (2) 运输层主要使用以下两种协议: **(1) 传输控制协议TCP(Transmission Control Protocol):**面向连接的,数据传输的单位是报文段,能够提供可靠的交付。 **(2) 用户数据包协议UDP(User Datagram Protocol):**无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能提供“尽最大努力交付”。

  3. 第三层——网络层(network layer)

    网络层(network layer)主要包括以下两个任务:

    (1) 负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层残生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报。

    (2) 选中合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。

  4. 第二层——数据链路层(data link layer)

    **数据链路层(data link layer):**常简称为链路层,我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间传送数据是直接传送的(点对点),这时就需要使用专门的链路层的协议。

    在两个相邻结点之间传送数据时,数据链路层将网络层交下来的IP数据报组装成帧(framing),在两个相邻结点之间的链路上“透明”地传送帧中的数据。

    每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。典型的帧长是几百字节到一千多字节。

    注意:”透明”是一个很重要的术语。它表示,某一个实际存在的事物看起来却好像不存在一样。”在数据链路层透明传送数据”表示无力什么样的比特组合的数据都能够通过这个数据链路层。因此,对所传送的数据来说,这些数据就“看不见”数据链路层。或者说,数据链路层对这些数据来说是透明的。 (1) 在接收数据时,控制信息使接收端能知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提取出数据部分,上交给网络层。 (2) 控制信息还使接收端能检测到所收到的帧中有无差错。如发现有差错,数据链路层就简单地丢弃这个出了差错的帧,以免继续传送下去白白浪费网络资源。如需改正错误,就由运输层的TCP协议来完成。

  5. 第一层——物理层(physical layer)

    **物理层(physical layer):**在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。

4.使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?

运行于 TCP 协议之上的协议

  1. HTTP 协议 :超文本传输协议(HTTP,HyperText Transfer Protocol)主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
  2. HTTPS 协议 :更安全的超文本传输协议(HTTPS,Hypertext Transfer Protocol Secure),身披 SSL 外衣的 HTTP 协议
  3. FTP 协议:文件传输协议 FTP(File Transfer Protocol),提供文件传输服务,基于 TCP 实现可靠的传输。使用 FTP 传输文件的好处是可以屏蔽操作系统和文件存储方式。
  4. SMTP 协议:简单邮件传输协议(SMTP,Simple Mail Transfer Protocol)的缩写,基于 TCP 协议,用来发送电子邮件。注意 ⚠️:接受邮件的协议不是 SMTP 而是 POP3 协议。
  5. POP3/IMAP 协议: POP3 和 IMAP 两者都是负责邮件接收的协议。
  6. Telent 协议:远程登陆协议,通过一个终端登陆到其他服务器。被一种称为 SSH 的非常安全的协议所取代。
  7. SSH 协议 : SSH( Secure Shell)是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 建立在可靠的传输协议 TCP 之上。
  8. ......

运行于 UDP 协议之上的协议

  1. DHCP 协议:动态主机配置协议,动态配置 IP 地址
  2. DNS域名系统(DNS,Domain Name System)将人类可读的域名 (例如,www.baidu.com) 转换为机器可读的 IP 地址 (例如,220.181.38.148)。 我们可以将其理解为专为互联网设计的电话薄。实际上 DNS 同时支持 UDP 和 TCP 协议。

5.TCP 三次握手和四次挥手(传输层)

建立连接-TCP 三次握手

image-20221005163607851

建立一个 TCP 连接需要“三次握手”,缺一不可 :

  • 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
  • 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 **SYN_RECV** 状态
  • 三次握手:客户端发送带有带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。

当建立了 3 次握手之后,客户端和服务端就可以传输数据啦!

为什么要三次握手?

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

  1. 第一次握手 :Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
  2. 第二次握手 :Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
  3. 第三次握手 :Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常

三次握手就能确认双发收发功能都正常,缺一不可。

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

断开连接-TCP 四次挥手

断开一个 TCP 连接则需要“四次挥手”,缺一不可 :

  1. 第一次挥手 :客户端发送一个 FIN(SEQ=X) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后,客户端进入 FIN-WAIT-1 状态。
  2. 第二次挥手 :服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (SEQ=X+1)标志的数据包->客户端 。然后,此时服务端进入**CLOSE-WAIT**状态,客户端进入**FIN-WAIT-2**状态。
  3. 第三次挥手 :服务端关闭与客户端的连接并发送一个 FIN (SEQ=y)标志的数据包->客户端请求关闭连接,然后,服务端进入LAST-ACK状态。
  4. 第四次挥手 :客户端发送 ACK (SEQ=y+1)标志的数据包->服务端并且进入TIME-WAIT状态,服务端在收到 ACK (SEQ=y+1)标志的数据包后进入 CLOSE 状态。此时,如果客户端等待 **2MSL** 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。

只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

image-20221005163906408

为什么要四次挥手?

**TCP是全双工通信,可以双向传输数据。**任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。

举个例子:A 和 B 打电话,通话即将结束后。

  1. 第一次挥手 : A 说“我没啥要说的了”
  2. 第二次挥手 :B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话
  3. 第三次挥手 :于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”
  4. 第四次挥手 :A 回答“知道了”,这样通话才算结束。

为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?

因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。

如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?

客户端没有收到 ACK 确认,会重新发送 FIN 请求。

为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?

第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端没有因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。

6.TCP 如何保证传输的可靠性?

  1. 基于数据块传输 :应用数据被分割成 TCP 认为最适合发送的数据块,再传输给网络层,数据块被称为报文段或段。
  2. 对失序数据包重新排序以及去重:TCP 为了保证不发生丢包,就给每个包一个序列号,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据就可以实现数据包去重。
  3. 校验和 : TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. 超时重传 : 当发送方发送数据之后,它启动一个定时器,等待目的端确认收到这个报文段。接收端实体对已成功收到的包发回一个相应的确认信息(ACK)。如果发送端实体在合理的往返时延(RTT)内未收到确认消息,那么对应的数据包就被假设为已丢失并进行重传。
  5. 流量控制 : TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议(TCP 利用滑动窗口实现流量控制)。
  6. 拥塞控制 : 当网络拥塞时,减少数据的发送。

7.TCP 的拥塞控制是怎么实现的?

为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

TCP 的拥塞控制采用了四种算法,即 慢开始拥塞避免快重传快恢复。在网络层也可以使路由器采用适当的分组丢弃策略(如主动队列管理 AQM),以减少网络拥塞的发生。

  • 慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍。
  • 拥塞避免: 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送放的 cwnd 加 1.
  • 快重传与快恢复: 在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。  当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

TCP的拥塞控制

8.报文、报文段、分组、包、数据报、帧、数据流的概念区别如下:

  1. 报文(message)

    我们将位于应用层的信息分组称为报文。报文是网络中交换与传输的数据单元,也是网络传输的单元。报文包含了将要发送的完整的数据信息,其长短不需一致。报文在传输过程中会不断地封装成分组、包、帧来传输,封装的方式就是添加一些控制信息组成的首部,那些就是报文头。

  2. 报文段(segment)

    通常是指起始点和目的地都是传输层的信息单元。

  3. 分组/包(packet)

    分组是在网络中传输的二进制格式的单元,为了提供通信性能和可靠性,每个用户发送的数据会被分成多个更小的部分。在每个部分的前面加上一些必要的控制信息组成的首部,有时也会加上尾部,就构成了一个分组。它的起始和目的地是网络层

  4. 数据报(datagram)

    面向无连接的数据传输,其工作过程类似于报文交换。采用数据报方式传输时,被传输的分组称为数据报。通常是指起始点和目的地都使用无连接网络服务的的网络层的信息单元。

  5. 帧(frame)

    帧是数据链路层的传输单元。它将上层传入的数据添加一个头部和尾部,组成了帧。它的起始点和目的点都是数据链路层。

  6. 数据单元(data unit)

    指许多信息单元。常用的数据单元有服务数据单元(SDU)、协议数据单元(PDU)。

    SDU是在同一机器上的两层之间传送信息。PDU是发送机器上每层的信息发送到接收机器上的相应层(同等层间交流用的)。

9.为什么要有最后一次ACK

客户端首先向服务器发送一个连接请求,但是可能这个连接请求走了远路,等了很长时间,服务器都没有收到,那么客户端可能会再次发送,此时服务器端收到并且回复SYN、ACK;在这个时候最先发送的那个连接请求到达服务器,那么服务器会回复一个SYN,ACK;但是客户端表示自己已经收到确认了,并不搭理这个回复,那么服务器可能陷入等待,如果这种情况多了,那么会导致服务器瘫痪,所以要发送第三个确认。

10.介绍一下TCP和UDP的区别

TCP和UDP有如下区别:

  1. 连接:TCP面向连接的传输层协议,即传输数据之前必须先建立好连接;UDP无连接。
  2. 服务对象:TCP点对点的两点间服务,即一条TCP连接只能有两个端点;UDP支持一对一,一对多,多对一,多对多的交互通信。
  3. 可靠性:TCP可靠交付:无差错,不丢失,不重复,按序到达;UDP尽最大努力交付,不保证可靠交付。
  4. 拥塞控制/流量控制:有拥塞控制和流量控制保证数据传输的安全性;UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。
  5. 报文长度:TCP动态报文长度,即TCP报文长度是根据接收方的窗口大小和当前网络拥塞情况决定的;UDP面向报文,不合并,不拆分,保留上面传下来报文的边界。
  6. 首部开销:TCP首部开销大,首部20个字节;UDP首部开销小,8字节(源端口,目的端口,数据长度,校验和)。
  7. 适用场景(由特性决定):数据完整性需让位于通信实时性,则应该选用TCP 协议(如文件传输、重要状态的更新等);反之,则使用 UDP 协议(如视频传输、实时通信等)。

11.说一说TCP是怎么控制流量的?

  1. 所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收。

  2. TCP控制流量的方法

    利用滑动窗口机制就可以实施流量控制。

    原理就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。

    解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小(注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段)。

为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认。

传输效率及Nagle算法

TCP的数据传输分为交互数据流和成块数据流,交互数据流一般是一些交互式应用程序的命令,所以这些数据很小,而考虑到TCP报头和IP报头的总和就有40字节,如果数据量很小的话,那么网络的利用效率就较低。

数据传输使用Nagle算法,Nagle算法很简单,就是规定一个TCP连接最多只能有一个未被确认的未完成的小分组。在该分组的确认到达之前不能发送其他的小分组。

但是也要考虑另一个问题,叫做糊涂窗口综合症。当接收方的缓存已满的时候,交互应用程序一次只从缓存中读取一个字节(这时候缓存中腾出一个字节),然后向发送方发送确认信息,此时发送方再发送一个字节(收到的窗口大小为1),这样网络的效率很低。

要解决这个问题,可以让接收方等待一段时间,使得接收缓存已有最够的空间容纳一个最长报文段,或者等到接收缓存已有一半的空间。只要这两种情况出现一种,就发送确认报文,同时发送方可以把数据积累成大的报文段发送。

12.ARQ 协议了解吗?

自动重传请求(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认信息(Acknoledgements,就是我们常说的 ACK),它通常会重新发送,直到收到确认或者重试超过一定的次数。

ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。

停止等待 ARQ 协议

停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;

在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。

1) 无差错情况:

发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。

2) 出现差错情况(超时重传):

停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重传时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为 自动重传请求 ARQ 。另外在停止等待协议中若收到重复分组,就丢弃该分组,但同时还要发送确认。

3) 确认丢失和确认迟到

  • 确认丢失 :确认消息在传输过程丢失。当 A 发送 M1 消息,B 收到后,B 向 A 发送了一个 M1 确认消息,但却在传输过程中丢失。而 A 并不知道,在超时计时过后,A 重传 M1 消息,B 再次收到该消息后采取以下两点措施:1. 丢弃这个重复的 M1 消息,不向上层交付。 2. 向 A 发送确认消息。(不会认为已经发送过了,就不再发送。A 能重传,就证明 B 的确认消息丢失)。
  • 确认迟到 :确认消息在传输过程中迟到。A 发送 M1 消息,B 收到并发送确认。在超时时间内没有收到确认消息,A 重传 M1 消息,B 仍然收到并继续发送确认消息(B 收到了 2 份 M1)。此时 A 收到了 B 第二次发送的确认消息。接着发送其他数据。过了一会,A 收到了 B 第一次发送的对 M1 的确认消息(A 也收到了 2 份确认消息)。处理如下:1. A 收到重复的确认后,直接丢弃。2. B 收到重复的 M1 后,也直接丢弃重复的 M1。

连续 ARQ 协议

连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。

缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。

13.从输入URL 到页面展示到底发生了什么?

image-20221006155315619

总体来说分为以下几个过程:

  1. DNS 解析
  2. TCP 连接
  3. 发送 HTTP 请求
  4. 服务器处理请求并返回 HTTP 报文
  5. 浏览器解析渲染页面
  6. 连接结束

14. 如何利用UDP实现可靠传输?

  1. 实现方法:

    (1)将实现放到应用层,然后类似于TCP,实现确认机制、重传机制和窗口确认机制;

    (2)给数据包进行编号,按顺序接收并存储,接收端收到数据包后发送确认信息给发送端,发送端接收到确认信息后继续发送,若接收端接收的数据不是期望的顺序编号,则要求重发;(主要解决丢包和包无序的问题)

  2. 已经实现的可靠UDP:

    (1)RUDP 可靠数据报传输协议;

    (2)RTP 实时传输协议

    为数据提供了具有实时特征的端对端传送服务;例如:组播或单播网络服务下的交互式视频、音频或模拟数据。

    (3)UDT

    基于UDP的数据传输协议,是一种互联网传输协议; 主要目的是支持高速广域网上的海量数据传输,引入了新的拥塞控制和数据可靠性控制机制(互联网上的标准数据传输协议TCP在高带宽长距离的网络上性能很差);

UDT是面向连接的双向的应用层协议,同时支持可靠的数据流传输和部分可靠的数据报服务;

应用:高速数据传输,点到点技术(P2P),防火墙穿透,多媒体数据传输;

15.HTTP

HTTP 常见状态码总结(应用层)

image-20221006165148997

1xx Informational(信息性状态码)

2xx Success(成功状态码)

  • 200 OK :请求被成功处理。比如我们发送一个查询用户数据的HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
  • 201 Created :请求被成功处理并且在服务端创建了一个新的资源。比如我们通过 POST 请求创建一个新的用户。
  • 202 Accepted :服务端已经接收到了请求,但是还未处理。
  • 204 No Content : 服务端已经成功处理了请求,但是没有返回任何内容。

3xx Redirection(重定向状态码)

  • 301 Moved Permanently : 资源被永久重定向了。比如你的网站的网址更换了。
  • 302 Found :资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。

4xx Client Error(客户端错误状态码)

  • 400 Bad Request : 发送的HTTP请求存在问题。比如请求参数不合法、请求方法错误。
  • 401 Unauthorized : 未认证却请求需要认证之后才能访问的资源。
  • 403 Forbidden :直接拒绝HTTP请求,不处理。一般用来针对非法请求。
  • 404 Not Found : 你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
  • 409 Conflict : 表示请求的资源与服务端当前的状态存在冲突,请求无法被处理

5xx Server Error(服务端错误状态码)

  • 500 Internal Server Error : 服务端出问题了(通常是服务端出Bug了)。比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。
  • 502 Bad Gateway :我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。

HTTP 和 HTTPS 有什么区别?(重要)

  • 端口号 :HTTP 默认是 80,HTTPS 默认是 443。
  • URL 前缀 :HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://
  • 安全性和资源消耗 : HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。

HTTPS的优点和缺点

(1)优点

尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:

(1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

(2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

(3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

(4)谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

(2)缺点

虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:

(1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;

(2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;

(3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

(4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。

(5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

混合加密

非对称加密耗时,非对称加密+对称加密结合可以吗?而且得尽量减少非对称加密的次数。当然是可以的,而且非对称加密、解密各只需用一次即可。以下就是加密过程:

(1)某网站拥有用于非对称加密的公钥A、私钥A’。

(2)浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。

(3)浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。

(4)服务器拿到后用私钥A’解密得到密钥X。

(5)这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密。

完美!HTTPS基本就是采用了这种方案。

https支持什么加密算法?

  1. 常见的对称加密算法有:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES ;
  2. 常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用);
  3. 常见的Hash算法有:MD2、MD4、MD5、HAVAL、SHA;

说一说HTTPS的秘钥交换过程。

  1. 客户端要访问一个网站,向支持https的服务器发起请求。

  2. 客户端向服务器发送自己支持的秘钥交换算法列表。

  3. 服务器选取一种秘钥交换算法加上CA证书返回给客户端。

  4. 客户端验证服务器是否合法,并生成一个随机数然后用协商好的加密算法加密生成随机秘钥,并用刚才从CA证书中拿到的公钥对其加密后发送给服务器。

  5. 服务器收到后用自己的私钥解密(中间人没有服务器的私钥,所以没有办法看到传输的数据,另外确认秘钥交换算法是在第一步,中间人是不知道秘钥交换算法(中间人是无法在第一步做手脚的,那等同于它自己就是一个真实客户端发起了一个新的请求,唯一一种情况攻击人有一个合法CA下发的证书,且客户端(一般为安卓设备)没有对CA下发的证书中的内容网站地址和当前请求地址做对比校验),就算攻击者有公钥,因为不知道协商协议,所以做不出来随机秘钥,顶多就是在传输过程中将报文拦截下来,乱改,但是给到服务器后,私钥是解不开乱改之后的密文的)。

  6. 服务器私钥解密之后,拿到对称秘钥,并且用它再加密一个信息,返回给浏览器。

    **注意:**最关键的一步就是在客户端采用 RSA 或 Diffie-Hellman 等加密算法生成 Pre-master,这个随机秘钥是用来计算最终的对称秘钥的,用公钥加密之后攻击人是不知道这个这个随机秘钥的,只有服务器才能解的开。

    image-20221006174149320

说一说HTTPS的证书认证过程。

HTTPS的证书认证过程如下:

  1. 浏览器将自己支持的一套加密规则发送给网站。

  2. 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。

  3. 浏览器获得网站证书之后浏览器要做以下工作:

    • (1) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
    • (2)如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
    • (3)使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
  4. 网站接收浏览器发来的数据之后要做以下的操作:

    (1) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。 (2) 使用密码加密一段握手消息,发送给浏览器。

  5. 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。

HTTP2.0和HTTP3.0有什么区别?

HTTP2.0和HTTP3.0的区别在于前者使用tcp协议而后者使用udp协议。

介绍一下HTTP协议中的长连接和短连接。

HTTP协议的底层使用TCP协议,所以HTTP协议的长连接和短连接在本质上是TCP层的长连接和短连接。由于TCP建立连接、维护连接、释放连接都是要消耗一定的资源,浪费一定的时间。所对于服务器来说,频繁的请求释放连接会浪费大量的时间,长时间维护太多的连接的话又需要消耗资源。所以长连接和短连接并不存在优劣之分,只是适用的场合不同而已。长连接和短连接分别有如下优点和缺点:

**长连接优点:**可以节省较多的TCP连接和释放的操作,节约时间,对于频繁请求资源的用户来说,适合长连接。

**长连接缺点:**由于有保活功能,当遇到大量的恶意连接时,服务器的压力会越来越大。这时服务器需要采取一些策略,关闭一些长时间没有进行读写事件的的连接。

**短连接优点:**短连接对服务器来说管理比较简单,只要存在的连接都是有效连接,不需要额外的控制手段,而且不会长时间占用资源 。

**短连接缺点:**如果客户端请求频繁的话,会在TCP的建立和释放上浪费大量的时间。

注意:HTTP/1.1版本起,默认使用长连接用以保持连接特性。使用长连接的HTTP协议,会在响应消息报文段加入: Connection: keep-alive。TCP中也有keep alive,但是TCP中的keep alive只是探测TCP连接是否活着,而HTTP中的keep-alive是让一个TCP连接获得更久一点。

介绍一下HTTP的失败码。

HTTP的错误码包含客户端错误4XX服务端错误5XX ,两种错误分别如下:

  1. 客户端错误 4XX

    这类的状态码是适用于客户端似乎有错误的情况。除了响应给HEAD请求外,服务器应该包含一个包括错误情况描述的实体,和它是暂时的还是永久性的。这些状态码适用于任何请求方法。用户代理应该展示所有包含的实体给用户。

    如果客户端正在发送数据,使用TCP的服务器应该在服务器关闭输出链接时,仔细确保客户端确认收到包含响应的数据包(receipt of the packet(s) ) 。如果客户端继续在服务器关闭后发送数据,服务器的TCP栈将会发生一个重置包给客户端,这可能会在 HTTP 应用程序读取和解释客户端的未确认输入缓冲区(input buffers)之前将其擦除。

    400(错误请求) 服务器不理解请求的语法。

    401(未授权) 请求要求进行身份验证。登录后,服务器可能会返回对页面的此响应。

    403(已禁止) 服务器拒绝请求。如果在 Googlebot 尝试抓取您网站上的有效网页时显示此状态代码(您可在 Google 网站管理员工具中诊断下的网络抓取页面上看到此状态代码),那么,这可能是您的服务器或主机拒绝 Googlebot 对其进行访问。

    404(未找到) 服务器找不到请求的网页。例如,如果请求是针对服务器上不存在的网页进行的,那么,服务器通常会返回此代码。

    如果您的网站上没有 robots.txt 文件,而您在 Google 网站管理员工具”诊断”标签的 robots.txt 页上发现此状态,那么,这是正确的状态。然而,如果您有 robots.txt 文件而又发现了此状态,那么,这说明您的 robots.txt 文件可能是命名错误或位于错误的位置。(该文件应当位于顶级域名上,且应当名为 robots.txt)。

    如果您在 Googlebot 尝试抓取的网址上发现此状态(位于”诊断”标签的 HTTP 错误页上),那么,这表示 Googlebot 所追踪的可能是另一网页中的无效链接(旧链接或输入有误的链接)。

    405(方法禁用) 禁用请求中所指定的方法。

    406(不接受) 无法使用请求的内容特性来响应请求的网页。

    407(需要代理授权) 此状态代码与 401(未授权)类似,但却指定了请求者应当使用代理进行授权。如果服务器返回此响应,那么,服务器还会指明请求者应当使用的代理。

    408(请求超时) 服务器等候请求时超时。

    409(冲突) 服务器在完成请求时发生冲突。服务器必须包含有关响应中所发生的冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码,同时会提供两个请求的差异列表。

    410(已删除) 如果请求的资源已被永久删除,那么,服务器会返回此响应。该代码与 404(未找到)代码类似,但在资源以前有但现在已经不复存在的情况下,有时会替代 404 代码出现。如果资源已被永久删除,那么,您应当使用 301 代码指定该资源的新位置。

    411(需要有效长度) 服务器不会接受包含无效内容长度标头字段的请求。

    412(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。

    413(请求实体过大) 服务器无法处理请求,因为请求实体过大,已超出服务器的处理能力。

    414(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法进行处理。

    415(不支持的媒体类型) 请求的格式不受请求页面的支持。

    416(请求范围不符合要求) 如果请求是针对网页的无效范围进行的,那么,服务器会返回此状态代码。

    417(未满足期望值) 服务器未满足”期望”请求标头字段的要求。

  2. 服务端错误 5XX

    响应状态码已数字5开头,表明了这类服务器知道其错误或者无法执行请求的情况。出了响应HEAD请求外,服务器应该包括一个包含错误情况说明的实体,以及他是暂时地还是永久性的,用户代理应该将所有包含的实体展示给用户。这些响应代码适用于任何请求方法。

    500(服务器内部错误) 服务器遇到错误,无法完成请求。

    501(尚未实施) 服务器不具备完成请求的功能。例如,当服务器无法识别请求方法时,服务器可能会返回此代码。

    502(错误网关) 服务器作为网关或代理,从上游服务器收到了无效的响应。

    503(服务不可用) 目前无法使用服务器(由于超载或进行停机维护)。通常,这只是一种暂时的状态。

    504(网关超时) 服务器作为网关或代理,未及时从上游服务器接收请求。

    505(HTTP 版本不受支持) 服务器不支持请求中所使用的 HTTP 协议版本。

16.重定向和请求转发有什么区别?

  1. 请求转发

    客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。

  2. 重定向

    客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)

  3. 二者区别

    (1)请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;

    (2)地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;

    (3)是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);

    (4)跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;

    (5)发生行为不同:重定向是客户端行为,转发是服务器端行为。

17.介绍一下DNS寻址的过程。

  1. 首先客户端位置是一台电脑或手机,在打开浏览器以后,比如输入http://www.zdns.cn的域名,它首先是由浏览器发起一个DNS解析请求,如果本地缓存服务器中找不到结果,则首先会向根服务器查询,根服务器里面记录的都是各个顶级域所在的服务器的位置,当向根服务器请求http://www.zdns.cn的时候,根服务器就会返回.cn服务器的位置信息;
  2. 递归服务器拿到.cn的权威服务器地址以后,就会寻问.cn的权威服务器,知不知道http://www.zdns.cn的位置。这个时候.cn权威服务器查找并返回http://zdns.cn服务器的地址;
  3. 继续向http://zdns.cn的权威服务器去查询这个地址,由http://zdns.cn的服务器给出了地址:202.173.11.10;
  4. 最终进入http的链接,顺利访问网站;

补充说明:一旦递归服务器拿到解析记录以后,就会在本地进行缓存,如果下次客户端再请求本地的递归域名服务器相同域名的时候,就不会再这样一层一层查了,因为本地服务器里面已经有缓存了,这个时候就直接把http://www.zdns.cn的记录返回给客户端就可以了。

image-20221007221830932

18.请介绍socket通信的具体步骤。

sockets(套接字)编程有三种:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。

  1. 服务器端编程的步骤

    (1)加载套接字库,创建套接字(WSAStartup()/socket());

    (2)绑定套接字到一个IP地址和一个端口上(bind());

    (3)将套接字设置为监听模式等待连接请求(listen());

    (4)请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

    (5)用返回的套接字和客户端进行通信(send()/recv());

    (6)返回,等待另一连接请求;

    (7)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

  2. 客户端编程的步骤:

    (1)加载套接字库,创建套接字(WSAStartup()/socket());

    (2)向服务器发出连接请求(connect());

    (3)和服务器端进行通信(send()/recv());

    (4)关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

//代码实例(服务器) 
#include <stdio.h> 
# include <Winsock2.h> 
void main() {  
    WORD wVersionRequested;  
    WSADATA wsaData;  int err;     
    wVersionRequested = MAKEWORD( 1, 1 );     
    err = WSAStartup( wVersionRequested, &wsaData );  
    if ( err != 0 ) {   
        return;  
    }     
    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {  
        WSACleanup( );   
        return;  
    }  
    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);   
    SOCKADDR_IN addrSrv; 
    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 
    addrSrv.sin_family=AF_INET; 
    addrSrv.sin_port=htons(6000);    
    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));    
    listen(sockSrv,5);   
    SOCKADDR_IN addrClient;  
    int len=sizeof(SOCKADDR); 
    while(1)  {   
        SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);  
        char sendBuf[50];   
        sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
        send(sockConn,sendBuf,strlen(sendBuf)+1,0);   
        char recvBuf[50];   
        recv(sockConn,recvBuf,50,0);  
        printf("%s\n",recvBuf);  
        closesocket(sockConn);  
    }  
}
//代码实例(客户端) 
#include <stdio.h> 
#include <Winsock2.h> 
void main() {  
    WORD wVersionRequested;  
    WSADATA wsaData; 
    int err;   
    wVersionRequested = MAKEWORD( 1, 1 );   
    err = WSAStartup( wVersionRequested, &wsaData );  
    if ( err != 0 ) {   return;  }   
    if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {  
        WSACleanup( );   
        return;  
    }  
    SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);    
    SOCKADDR_IN addrSrv;  
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrSrv.sin_family=AF_INET;  
    addrSrv.sin_port=htons(6000);  
    connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); 
    send(sockClient,"hello",strlen("hello")+1,0); 
    char recvBuf[50];  
    recv(sockClient,recvBuf,50,0); 
    printf("%s\n",recvBuf);   
    closesocket(sockClient); 
    WSACleanup();
}

服务端怎么提高处理socket连接的性能?

提高处理socket连接的性能,请遵循以下技巧:

  1. 最小化报文传输的延时。
  2. 最小化系统调用的负载。
  3. 为 Bandwidth Delay Product 调节 TCP 窗口。
  4. 动态优化 GNU/Linux TCP/IP 栈。

19.ARP 协议详解(网络层)(地址解析协议)

它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。

ARP 工作原理? 只希望大家记住几个关键词:ARP 表、广播问询、单播响应

20.

21.

22


标题:计算机网络
作者:joker
地址:https://upcjoker.top/articles/2022/10/18/1666075565408.html

    评论
    0 评论
avatar

取消