lukaliou123 / lukaliou123.github.io

lukaliou123在2022年的面试用知识点总结
Other
5 stars 0 forks source link

计算机网络知识总结 #2

Open lukaliou123 opened 2 years ago

lukaliou123 commented 2 years ago

1.UDP和TCP的区别

UDP (用户数据报协议)是无连接的connectionless,尽最大可能交付,没有拥塞机制,面向报文(对于应用程序传下来的保温不合并也不拆分,只是添加UDP首部),支持多种交互通信应用于直播,视频 首部有八个字节 TCP(传输控制协议或Transmission control protocol)是面向连接的connection-oriented protocol,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层) TCP首部字节有七种,包括序号,确认号,数据偏移(是什么),确认ACK,同步SYN,终止FIN,窗口 image

需要补充,TCP和UDP的首字节 UDP的偏移量的单位

补充:TCP和UDP的首部格式

image UDP 首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。 image TCP 首部格式比 UDP 复杂。 序号:用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。 确认号:期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。 数据偏移:指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。

控制位:八位从左到右分别是 CWR,ECE,URG,ACK,PSH,RST,SYN,FIN

CWR:CWR 标志与后面的 ECE 标志都用于 IP 首部的 ECN 字段,ECE 标志为 1 时,则通知对方已将拥塞窗口缩小;

ECE:若其值为 1 则会通知对方,从对方到这边的网络有阻塞。在收到数据包的 IP 首部中 ECN 为 1 时将 TCP 首部中的 ECE 设为 1;

URG:该位设为 1,表示包中有需要紧急处理的数据,对于需要紧急处理的数据,与后面的紧急指针有关;

ACK:该位设为 1,确认应答的字段有效,TCP规定除了最初建立连接时的 SYN 包之外该位必须设为 1;

PSH:该位设为 1,表示需要将收到的数据立刻传给上层应用协议,若设为 0,则先将数据进行缓存;

RST:该位设为 1,表示 TCP 连接出现异常必须强制断开连接;

SYN:用于建立连接,该位设为 1,表示希望建立连接,并在其序列号的字段进行序列号初值设定;

FIN:该位设为 1,表示今后不再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段。

每个主机又对对方的 FIN 包进行确认应答之后可以断开连接。不过,主机收到 FIN 设置为 1 的 TCP 段之后不必马上回复一个 FIN 包,而是可以等到缓冲区中的所有数据都因为已成功发送而被自动删除之后再发 FIN 包

窗口:窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

大小:1500

如果要改造UDP协议,让它可以较快同时保证准确性,怎么补充让它更加可靠?(补充)

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。

最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。

1、添加seq/ack机制,确保数据发送到对端 2、添加发送和接收缓冲区,主要是用户超时重传。 3、添加超时重传机制。 详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。

如何基于 UDP 协议实现可靠传输? 已经有的可靠实现,QUIC协议

QUIC协议全名"Quick UDP Internet Connections",是Google设计的一种基于UDP的、支持多路复用的、安全的传输协议,目标是提供与TLS/SSL相当的安全性,但延迟却低于TLS/SSL。 1.错误校验:UDP本身并不提供错误检查功能,所以我们可以借鉴TCP和QUIC的做法,添加校验和字段来确认数据包的正确性。数据包错误(如校验和不匹配)时会丢弃,并期待发送方重发。

2.序列号和确认号:每个发送的数据包都分配一个唯一的序列号,接收方在收到数据包后,返回一个包含相应确认号(通常是序列号+1)的ACK数据包。这样,发送方就知道其数据包已被接收。

3.丢包重传:如果发送方在一定时间内没有收到确认信息,它会假定数据包已丢失,并重新发送数据包。这个重传时间间隔应该动态调整,以适应网络条件。

4.拥塞控制:我们可以借鉴TCP和QUIC的拥塞控制算法,如慢启动、拥塞避免、快速重传等,来避免因网络拥塞导致的数据包丢失。

5.无头阻塞多路复用:正如QUIC一样,我们可以创建多个并行的“流”,每个“流”有各自独立的序列号,因此即使在一个流中的数据包丢失,也不会影响其他流的数据包的传输和处理。

6.快速握手:在建立连接时,我们可以使用QUIC的方式,缓存先前的“加密上下文”,从而使得重连只需要0-RTT。

QUIC协议与TCP相比,具有以下主要优点:

1.无头阻塞:TCP采用的是字节流模型,导致一个连接中的所有请求都在一个队列中,如果一个请求的处理过程出现了问题(例如,数据包丢失),那么它后面的所有请求都会被阻塞,即使后面的数据包已经到达。这就是著名的“队头阻塞”问题。而QUIC允许同一连接中的多个请求并行进行,因此避免了队头阻塞问题。

2.加速握手:在TCP中,新的连接需要进行三次握手,而且如果加上TLS的话,需要更多的往返通信。而QUIC协议则采用0-RTT或1-RTT的快速握手机制,大大提高了握手速度。

3.更好的拥塞控制:QUIC协议对拥塞控制有更好的处理机制。在TCP中,数据包的丢失被认为是网络拥塞的标志,但在QUIC中,丢包和网络拥塞被分开处理。

4.集成了TLS安全功能:在TCP中,安全性通常由上层的TLS协议提供,而QUIC直接在传输层协议中集成了TLS,使得安全性得到了保障。

5.更适合无线网络环境:在无线网络环境中,网络条件可能会快速变化,TCP的性能在这种情况下可能会受到影响。而QUIC的设计使其更适应这种环境。

所以,在需要高并发、低延迟、高可靠性、以及在无线网络环境下的应用,都可以考虑使用QUIC协议。这些场景包括:视频流媒体、在线游戏、VoIP等。同时,QUIC协议也被广泛用在Google的各项服务中。

lukaliou123 commented 2 years ago

2.OSI(Open system interconnection model)

  1. 物理层Physical Layer:定义网络设备接口标准,电气标准(电压),如何在物理链路上传输的更快
  2. 数据链路层Data Link Layer:通过差错控制,流量控制等方法,使有差错的物理线路变为无差错的数据链路。在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
  3. 网络层Network Layer:负责选择路由最佳路径,规划IP地址(ipv4和ipv6变化只会影响网络层),拥塞控制
  4. 运输层Transport Layer:负责向两台主机进程之间的通信提供可靠的透明数据传输,传输层协议为不同主机上运行的进程提供逻辑通信。网络层协议负责的是提供主机间的逻辑通信:传输层协议负责的是提供进程间的逻辑通信。比如TCP和ICP协议
  5. 会话层Session Layer:是用户应用程序和网络之间的接口,负责在网络中的两节点之间建立、维持、终止通信。
  6. 表示层Presentation Layer:处理用户数据的表示问题,如数据的编码、格式转换、加密和解密和解压缩。把数据转换为能与接收者的系统格式并适合传输的格式,既让两个系统可以交换信息
  7. 应用层Presentation Layer::直接为用户的应用进程提供网络通信服务,如HTTP,SMTP,FTP,DNS等 image

2.X(补)五层协议:

应用层(将会话层,表示层,应用层合并) 应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用.应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则.对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文。

lukaliou123 commented 2 years ago

3. TCP UDP使用场景

UDP:质量要求不高,通讯速度尽可能快,即时通信:语音,视频,直播 TCP:对通讯质量有要求,要求数据准确无误可靠的传递给对方,比如文件传输,发送,接收邮件。传输文件协议:HTTP,HTTPS,FTP,邮件传输:POP,SMTP

lukaliou123 commented 2 years ago

4. TCP三次握手

客户端发送到服务端 握手1: 客户端发送syn包到服务端 握手2:服务端回复sym+ack包 握手3:客户端回复ack包 三次握手是为了防止丢包的链接被服务端连接 image 开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态 image 客户端会随机初始化序号(client_isn)isn:Initial Sequence Number,将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。 image 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。 image 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。

服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。

从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的,这也是面试常问的题。

一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。

4.1.为什么要三次握手

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

第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常 所以三次握手就能确认双发收发功能都正常,缺一不可。

主要为了三点: 1.防止历史连接造成的混乱:TCP的三次握手过程是为了防止旧的、失效的连接请求报文段对当前的新连接产生影响。也就是说,如果网络中某些地方还留有上次连接请求的报文段,那么这些“历史连接”的报文段可能会在网络延迟后到达服务器。如果服务器不能区分这是一个已经失效的“历史连接”,那么它可能会错误地认为这是一个新的连接请求。这就可能导致服务端的资源被浪费,因为它在错误地等待一个早已失效的连接。但如果有了三次握手的过程,服务器在收到客户端的连接请求后,会回复一个确认信号,并附带一个自己的序列号。这样,只有当客户端再次确认这个序列号,服务端才会认为新的连接建立。这样一来,就可以防止“历史连接”对当前连接的干扰,避免了资源的浪费。 2.保证双方都有能力接收和发送信息:之前讲了 3.为了初始化序列号:序列号(Sequence Number)是TCP连接中重要的一部分,它是用来保证TCP数据流的有序传输的。在三次握手过程中,双方都会发送各自的初始序列号(ISN),并且确认对方已经接收到,从而保证了后续数据传输的顺序性。

补充:原本还有四次握手,但四次握手可以优化为三次 image

4.2 为什么要传回SYN码

接收端传送回syn是为了告诉发送端,我确实收到你发的信号了 image

SYN 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符 ,在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ])消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

4.3 为什么要传回ACK

SYN表示发送到接收方通道没问题,ACK表示接收到发送方通道没问题

lukaliou123 commented 2 years ago

5. 断开连接的四次挥手

挥手1:客户端发送一包fin包表示关闭连接,进入终止等待1状态 挥手2:服务端回复ack,进入关闭等待状态,服务端进入终止等待2状态 挥手3:服务端发送fin包,进入最后确认状态 挥手4:客户端回复ack,进入超时等待状态,服务端收到后进入关闭状态 image

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

举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。

5.2.为什么需要四次挥手

客户端和服务端两次挥手后,客户端和服务端分别释放连接的过程。客户端在发送完最后一次确认之后,还要等待2MSL的时间,原因有2:1.为了让客户端按照正常步骤进入关闭状态。2.为了防止已经失效的请求连接报文出现在下次连接中

  1. 客户端最后一个ACK可能丢失,B无法正常进入关闭状态。于是B会重新发送FIN,如果客户已经关闭,就会导致B不能正常释放。而如果A还在TIME WAIT,就可以收到B重传,再应答,B就可以进入CLOSED状态
  2. 这2MSL的等待时间里,所有本次连接的报文已经从网络小时,不会出现在下次连接中。

5.3.为什么 TIME_WAIT 等待的时间是 2MSL?

MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为 TCP 报文基于是 IP 协议的,而 IP 头中有一个 TTL 字段,是 IP 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。 TTL 的值一般是 64,Linux 将 MSL 设置为 30 秒,意味着 Linux 认为数据报文经过 64 个路由器的时间不会超过 30 秒,如果超过了,就认为报文已经消失在网络中了。 TIME_WAIT 等待 2 倍的 MSL,比较合理的解释是: 网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间

比如,如果被动关闭方没有收到断开连接的最后的 ACK 报文,就会触发超时重发 FIN 报文,另一方接收到 FIN 后,会重发 ACK 给被动关闭方, 一来一去正好 2 个 MSL

可以看到 2MSL时长 这其实是相当于至少允许报文丢失一次。比如,若 ACK 在一个 MSL 内丢失,这样被动方重发的 FIN 会在第 2 个 MSL 内到达,TIME_WAIT 状态的连接可以应对

为什么不是 4 或者 8 MSL 的时长呢?你可以想象一个丢包率达到百分之一的糟糕网络,连续两次丢包的概率只有万分之一,这个概率实在是太小了,忽略它比解决它更具性价比。

MSL 是 Maximum Segment Lifetime

一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

lukaliou123 commented 2 years ago

6. TCP 协议如何保证可靠传输

1.数据分割:TCP会将应用数据分割成适当大小的数据包进行发送,使得网络传输更为高效。 2.包编号和排序:TCP给每个数据包一个序列号,接收方会按照这些序列号排序,这样即使数据包乱序到达,也能被正确地重组。 3.校验和:TCP通过计算数据的校验和来检测数据在传输过程中是否发生了错误,如果接收到的数据校验和有误,那么这个数据包将被丢弃。 4.流量控制:流量控制防止发送方发送数据的速度超过接收方处理数据的速度。这主要通过滑动窗口机制来实现。 5.拥塞控制:当网络中的数据包过多,导致网络通信质量下降时,TCP会自动降低发送数据的速度,以减轻网络拥塞。 6.ARQ协议:ARQ (Automatic Repeat reQuest)协议是通过等待确认的方式来保证数据的正确传输的,如果发送方在超时时间内未收到接收方的确认,它会自动重发数据。 7.超时重传:如果TCP发出一个数据包后,它会启动一个计时器,如果在超时时间内未收到确认,那么这个数据包会被重新发 重传水很深,其中sack(选择性确认)和dsack作为接收方发回来的数字,会告诉发送发哪些需要发送,哪些已经被发送过了,这个一般接快速重传

sack一般接发送方丢失,dsack接ack方丢失

校验和的一些补充

校验和是一种错误检测机制,用于在数据传输过程中检测是否有错误发生。具体来说,在TCP协议中,发送方会对TCP首部和数据进行求和计算,得到一个校验和,这个校验和会被一同发送到接收方

接收方在接收到数据后,也会进行相同的校验和计算。然后将计算得到的校验和与从发送方接收到的校验和进行比较。如果两者相同,那么数据就被认为是没有错误的;如果两者不同,那么数据就被认为是有错误的,接收方会丢弃这个数据包,并可以请求发送方重发。 TCP校验和的计算过程 1.将TCP首部和数据看作是由16位的字组成的(如果数据的长度是奇数,那么在数据的末尾会添加一个额外的字节,以使得数据的长度是偶数)。

2.将这些16位的字进行相加(不考虑进位)。

3.如果在相加过程中出现进位,那么将进位添加到结果的低16位。

4.最后,取相加结果的反码(即将每个比特位取反)。 image image

伪首部的构成?

“伪首部”并不是TCP首部真正存在的部分,而是在计算校验和时临时添加的。它的存在主要是为了在计算校验和时加入一些额外的重要信息,使得接收端能够更好地验证数据的完整性和正确性。

在TCP的校验和计算中,伪首部包含了如下的IP首部字段

源IP地址 目的IP地址 协议号(TCP是6) TCP长度(TCP首部和数据部分的总长度)

lukaliou123 commented 2 years ago

7.ARQ协议

自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。ARQ包括停止等待ARQ协议和连续ARQ协议

停止等待协议

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

连续ARQ协议

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

lukaliou123 commented 2 years ago

8.拥塞控制

拥塞控制就是防止过多的数据注入网络中,使网络中的路由器或链路不至过载。 为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

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

1.慢开始: 慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。

2.拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送放的cwnd加1. 拥塞避免算法和慢启动算法是两个不同的算法,但是他们都是为了解决拥塞,在实际中这两个算法通常是在一起实现的。相比于慢启动算法拥塞避免算法多维护了一个慢启动阈值ssthresh

cwnd<ssthresh时,拥塞窗口使用慢启动算法,按指数级增长。 当cwnd>ssthresh时,拥塞窗口使用拥塞避免算法,按线性增长。

拥塞避免算法每经过一个RTT,拥塞窗口增加initcwnd。 image

3.快重传与快恢复:在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。 有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。有了 FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。 快恢复部分: 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半,为了预防网络拥塞

将拥塞窗口cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法

lukaliou123 commented 2 years ago

9.在浏览器中输入url地址->>显示主页的过程(面试常客)

image 1.URL 输入:在浏览器中输入URL地址。

2.域名解析(DNS Lookup):浏览器首先需要知道你想访问的服务器的IP地址,这就需要进行DNS查询。浏览器首先会查看本地DNS缓存,如果没有,则会向本地的DNS服务器发送查询请求。如果本地DNS服务器也无法解析,它就会把请求转发给上级DNS服务器,直到找到正确的IP地址。

3.建立TCP连接:浏览器和服务器之间的通信需要依靠TCP协议,所以它们之间需要建立一个TCP连接。这就涉及到我们之前讨论过的TCP的三次握手过程。

4.发送HTTP请求:TCP连接建立之后,浏览器就可以向服务器发送HTTP请求了。这个请求包括你想要获取的资源的路径、方法(GET、POST等)、以及可能的头部信息(如Cookie、User-Agent等)。

5.服务器处理请求并返回HTTP响应:服务器收到HTTP请求后,会根据请求中的信息来处理这个请求,处理完后,服务器会将响应的内容以及状态码,如200表示成功,404表示资源未找到等,返回给浏览器。

6.浏览器解析HTML:浏览器收到服务器返回的HTML文件后,会进行解析,并构建DOM树。

7.浏览器解析CSS和JavaScript:在解析HTML的同时,浏览器还会解析页面中的CSS样式和JavaScript代码。CSS会被用来生成CSSOM树,并和DOM树一起生成渲染树。JavaScript可能会修改DOM树和CSSOM树。

8.浏览器开始渲染页面:当DOM树和CSSOM树构建完成,浏览器就可以开始渲染页面了。这个过程中可能会涉及到布局(Layout)和绘制(Paint)。

9.加载外部资源:如果HTML、CSS或JavaScript中引用了其他的资源,如图片、字体等,浏览器会发送额外的HTTP请求去加载。

10.页面加载完毕:当所有的资源都加载完毕,页面就显示完成了。 MAC地址是数据链路层的地址

10.状态码

image 200 OK:这可能是你最想看到的状态码了,它表示请求已经成功,响应的主体部分将包含服务器返回的表示请求结果的实体。

301 Moved Permanently:这个状态码表示请求的URI已经被更新了,新的URI将在响应的Location域中给出,客户端应该使用这个新的URI来更新自己的书签。

400 Bad Request:这个状态码表示客户端的请求语法有错误,服务器无法理解。

401 Unauthorized:这个状态码表示客户端在请求一个受保护的资源但是没有提供正确的身份验证证书。

403 Forbidden:这个状态码表示客户端的请求在权限上无法被服务器接受,也就是说,当前用户没有权限访问请求的资源。

404 Not Found:这个状态码表示服务器找不到请求的资源,也就是所请求的资源在服务器上不存在。

500 Internal Server Error:这个状态码表示服务器在处理请求的过程中内部发生了错误,也就是所请求的方法无法被服务器完成。

501 Not Implemented:该状态码表示服务器不支持当前请求所需要的功能。比如,客户端发出了一个服务器无法识别的请求方法,或者是服务器没有能力完成请求。

502 Bad Gateway:该状态码表示服务器作为网关或者代理,尝试执行请求时,从上游服务器接收到无效的响应。

503 Service Unavailable:该状态码表示服务器目前无法使用(由于超载或停机维护通常是暂时的状态)。如果服务器知道停机的时间,那么响应中可以包含一个Retry-After头信息来告诉客户端什么时候可以重新尝试。

504 Gateway Timeout:该状态码表示服务器作为网关或者代理,但是没有及时从上游服务器收到请求。

505 HTTP Version Not Supported:该状态码表示服务器不支持请求中所使用的HTTP版本。

DNS解析过程,本地缓存是看哪个文件?那么这个文件怎么更新呢?(补充)

image

C:\Windows\System32\drivers\etc 本地的host文件

刷新:ipconfig /flushdns

lukaliou123 commented 2 years ago

11.Cookie的作用是什么?和Session有什么区别?(解释HTTP如何保存用户信息)

Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。

Cookie一般用来保存用户信息 比如①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③登录一次网站后访问网站其他页面不需要重新登录。

Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端

Cookie 被禁用怎么办?

最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面

关系:

在许多应用中,Session和Cookie一起使用,以实现用户认证等功能。当用户成功登录后,服务器会创建一个Session,并将Session的ID存放在Cookie中返回给浏览器。当浏览器再次请求服务器时,它会将这个Session ID放在请求头中一并发送给服务器。服务器会检查这个Session ID,如果有效,则认为用户已经认证,可以接收用户请求。

Cookie存储在浏览器端,而Session存储在服务器端。因此,Cookie更容易受到攻击,如Cookie劫持、Cookie注入等。而Session相对更安全,但如果Session过多,会占用服务器的资源。

12.URL和URI的区别是什么

URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。 URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。

URI的作用像身份证号一样,URL的作用更像家庭住址一样。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息

lukaliou123 commented 2 years ago

13.HTTP的长连接和短连接

http的长连接和端链接本质上是TCP的长连接和短链接,从httpp1.1开始默认使用长连接

短链接是指客户端和服务端每进行一次请求操作,就建立一次TCP链接,收到服务器响应后就断开连接

长连接值客户端和服务端建立TCP连接后,连接持续存在,不会因为一次HTTP请求关闭,后续的请求也使用这个连接通信

14.HTTP1.0和1.1的主要区别是什么

image

HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:

1.连接方式 : HTTP/1.0 为短连接,HTTP/1.1 支持长连接。 2.状态响应码 : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,100 (Continue)——在请求大资源前的预热请求,206 (Partial Content)——范围请求的标识码,409 (Conflict)——请求与当前资源的规定冲突,410 (Gone)——资源已被永久转移,而且没有任何已知的转发地址。 3.缓存机制 : 在 HTTP/1.0 中主要使用 Header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP/1.1 则引入了更多的缓存控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。 4.带宽:HTTP/1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP/1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 5.Host 头(Host Header)处理 :HTTP/1.1 引入了 Host 头字段,允许在同一 IP 地址上托管多个域名,从而支持虚拟主机的功能。而 HTTP/1.0 没有 Host 头字段,无法实现虚拟主机。

14.1.HTTP/1.1 和 HTTP/2.0 有什么区别?

image 1.IO 多路复用(Multiplexing):HTTP/2.0 在同一连接上可以同时传输多个请求和响应(可以看作是 HTTP/1.1 中长链接的升级版本)。HTTP/1.1 则使用串行方式,每个请求和响应都需要独立的连接。这使得 HTTP/2.0 在处理多个请求时更加高效,减少了网络延迟和提高了性能。

2.二进制帧(Binary Frames):HTTP/2.0 使用二进制帧进行数据传输,而 HTTP/1.1 则使用文本格式的报文。二进制帧更加紧凑和高效,减少了传输的数据量和带宽消耗。

3.头部压缩(Header Compression):HTTP/1.1 支持Body压缩,Header不支持压缩。HTTP/2.0 支持对Header压缩,减少了网络开销。如何压缩的?用一个动态表,压缩出现过的头部字段作为索引

4.服务器推送(Server Push):HTTP/2.0 支持服务器推送,可以在客户端请求一个资源时,将其他相关资源一并推送给客户端,从而减少了客户端的请求次数和延迟。而 HTTP/1.1 需要客户端自己发送请求来获取相关资源

14.2.HTTP/2.0 和 HTTP/3.0 有什么区别?

image 1.传输协议:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections) 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC

2.连接建立:HTTP/2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接

3.队头阻塞:HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。由于 QUIC 协议的特性,HTTP/3.0 在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。

4.错误恢复:HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP/2.0 则需要依赖于 TCP 的错误恢复机制

5.安全性:HTTP/2.0 和 HTTP/3.0 在安全性上都有较高的要求,支持加密通信,但在实现上有所不同。HTTP/2.0 使用 TLS 协议进行加密,而 HTTP/3.0 基于 QUIC 协议,包含了内置的加密和身份验证机制,可以提供更强的安全性

lukaliou123 commented 2 years ago

15.HTTP与HTTPS的区别

1645540008(1)

补充:HTTPS构成,+SSL/TLS概念

HTTPS=HTTP+SSL/TCL,也就是用SSL/TLS对数据进行加密和解密,Http进行传输

SSL,即Secure Sockeys Layer(安全套接层协议),是网络通信协议安全及数据完整性的一种安全协议 TLS,即Transport Layer Securiy(安全传输层协议),它是SSL3.0的后续版本

16.HTTPS的加密过程(SSL的详细过程)

1.客户端向服务端发起第一次握手请求,告诉服务端客户端所支持的SSL的指定版本、加密算法及密钥长度等信息。 2.服务端将自己的公钥发给数字证书认证机构,数字证书认证机构利用自己的私钥对服务器的公钥进行数字签名,并给服务器颁发公钥证书。 3.服务端将证书发给客服端。 4.客服端利用数字认证机构的公钥,向数字证书认证机构验证公钥证书上的数字签名,确认服务器公开密钥的真实性。 5.客服端使用服务端的公开密钥加密自己生成的对称密钥,发给服务端。 6.服务端收到后利用私钥解密信息,获得客户端发来的对称密钥。 7.通信双方可用对称密钥来加密解密信息。

上述流程存在的一个问题是客户端哪里来的数字认证机构的公钥,其实,在很多浏览器开发时,会内置常用数字证书认证机构的公钥。 image

补:数字证书与数字签名

数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。 比如Https的数字证书,就是为了避免公钥被中间人冒充篡改 数字签名被数字证书包含:公钥和个人等信息,经过Hash摘要算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息照耀加密,形成数字签名

补:对称加密与非对称加密

对称加密:指加密和解密使用同一密钥,有点是运算速度较快,缺点是如何安全将密钥传输给另一方。常见的对称加密算法有DES、AES等。 非对称加密:指的是加密和解密用不同的密钥(即公钥和私钥)。公钥与私钥是成对存在的,如果用公钥对数据进行加密,只有对应的私钥才能解密。常见的非对称加密算法有RSA

lukaliou123 commented 2 years ago

17.GET和POST区别

作用: GET用于获取资源,POST用于传输实体主体

参数位置: GET的参数放在URL中,POST的参数存储在实体主体中,并且GET方法提交的请求的URL中的数据做多是2048字节,POST请求没有大小限制。

安全性: GET方法因为参数放在URL中,安全性相对于POST较差一些,POST放在包体里

幂等性 GET方法是具有幂等性的,而POST方法不具有幂等性。这里幂等性指客户端连续发出多次请求,收到的结果都是一样的.

17.1.其他的一些命令

1.PUT:PUT方法主要用于更新资源,请求体中包含了需要更新的数据。PUT是幂等的操作,多次执行同样的PUT请求,服务器端的结果都是一样的。

2.DELETE:DELETE方法用于删除指定的资源。和PUT一样,DELETE也是幂等的。

3.HEAD:HEAD方法和GET方法类似,都是向服务器请求一个资源,但是,HEAD不返回HTTP响应体,只返回HTTP头部信息。HEAD请求常用于检查链接的有效性,以及资源更新情况等。

虽然PUT、DELETE、HEAD等方法在HTTP协议中定义了,但是它们的使用相对GET和POST来说少一些,这主要是因为:

1.与HTML表单兼容性:HTML表单只支持GET和POST请求。在早期的Web开发中,表单是用户输入和交互的主要方式,这使得GET和POST请求方法更常用。

2.Web服务器支持:并非所有的Web服务器都支持PUT和DELETE方法。一些简单的Web服务器可能只实现了GET和POST方法。

3.浏览器支持:早期的Web浏览器只支持GET和POST请求,这也是为什么GET和POST比其他HTTP方法更常用的原因之一。

4.安全性考虑:对于DELETE方法,因为其直接删除服务器资源,如果没有做好权限控制,可能会带来安全问题,所以并不是所有的Web应用都会开启DELETE请求。

lukaliou123 commented 2 years ago

18.HTTP报文结构

用于 HTTP 协议交互的信息被称为 HTTP 报文,请求端(客户端)的 HTTP 报文叫做请求报文;响应端(服务器端)的叫做响应报文,HTTP 报文本身是由多行数据构成的字符串文本image

HTTP 请求报文结构:

HTTP 报文大致可分为请求行、请求头、空行、请求主体四部分。也有人将报文分为请求首部(请求行+请求头)、空行、请求主体。通常,前几部分是必有的,最后的请求体不是必有的,每个部分结尾都用空行来作为结束标志。 image

请求行:请求方法(Method) + 空格 + 统一资源标识符(URI) + 空格 + HTTP版本 + CR LF ;

请求头:字段名 + 冒号 + 值 + CR LF ;

空行: 回车符(CR)+ 换行符(LF) ;

请求体: 由用户自定义添加,如post的body等;

请求首部实例(谷歌浏览器Network面板)image

HTTP 响应报文结构:

响应报文结构与请求报文结构唯一的区别在于第一行中用状态信息代替了请求信息状态行(status line)通过提供一个状态码来说明所请求的资源情况。 image

状态行:HTTP版本 + 空格 + 状态码 + 空格 + 状态码描述 + CR LF ;

响应头:字段名 + 冒号 + 值 + CR LF ;

空行: 回车符(CR)+ 换行符(LF) ;

响应体: 由用户自定义添加,如post的body等;

响应首部实例(谷歌浏览器Network面板)image

响应状态码: 状态代码由服务器发出,以响应客户端对服务器的请求。 1xx(信息):收到请求,继续处理 2xx(成功):请求已成功接收,理解和接受 3xx(重定向):需要采取进一步措施才能完成请求 4xx(客户端错误):请求包含错误的语法或无法满足 5xx(服务器错误):服务器无法满足明显有效的请求

lukaliou123 commented 2 years ago

19.你知道的HTTP头有哪些

HTTP Request Header常见的请求头

Accept:浏览器能够处理的内容类型 Accept-Charset:浏览器能够显示的字符集 Accept-Encoding:浏览器能够处理的压缩编码 Accept-Language:浏览器当前设置的语言 Connection:浏览器与服务器之间连接的类型 Cookie:当前页面设置的任何Cookie Host:发出请求的页面所在的域 Referer:发出请求的页面的URL User-Agent:浏览器的用户代理字符串

GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Connection: keep-alive

HTTP Responses Header 常见的响应头:

Date:表示消息发送的时间,时间的描述格式由rfc822定义 server:服务器名字 Connection:浏览器与服务器之间连接的类型 content-type:表示后面的文档属于什么MIME类型 Cache-Control:控制HTTP缓存

其中Content-type值常用的有以下几种: application/x-www-form-urlencoded:form表单类型 ,浏览器的原生form表单 application/json:序列化后的 JSON 字符串,最常用,适合 RESTful 的接口 text/xml:是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范 multipart/form-data:使用表单上传文件时,必须让 form 的 enctype 等于这个值 1650288288(1)

经典的响应头结构 1690283079841

补充:常出现的相关问题

1.HTTP请求头和响应头中常见的一些字段,以及它们的作用是什么

"Content-Type": 表示资源的MIME类型,如"text/html","application/json"等。 "Accept": 客户端能够处理的内容类型。 "User-Agent": 描述客户端信息,如浏览器类型和版本,操作系统等。 "Host": 表示请求的目标服务器的地址。 "Content-Length": 消息主体的长度。 "Set-Cookie": 服务器向客户端发送的cookie信息。 "Cookie": 客户端回传给服务器的cookie信息。

2.设置自定义的HTTP头

不同的编程语言和框架提供了不同的方法来设置自定义的HTTP头。在JavaScript中,你可以使用XMLHttpRequest或fetch API来设置自定义头。在Python的requests库中,你可以通过将自定义头作为字典传递给requests.get()或requests.post()方法来设置自定义头。

3."User-Agent"字段在实际应用中如何使用

"User-Agent"字段描述了发出请求的客户端应用程序的类型、名称、版本和操作系统。根据"User-Agent",服务器可以返回针对特定客户端的最优内容,或者进行统计和分析。

4."Content-Encoding"和"Transfer-Encoding"字段

"Content-Encoding": 描述了资源的编码格式,例如gzip。浏览器会根据这个头解压返回的内容。 "Transfer-Encoding": 描述了在消息传输过程中的编码方式,例如chunked。

5."Set-Cookie"和"Cookie"字段

"Set-Cookie": 服务器通过Set-Cookie头发送cookie到客户端。客户端之后的请求会带上这个cookie,服务器可以用来识别用户或跟踪用户行为。 "Cookie": 客户端在每次请求时,都会将之前服务器下发的cookie信息在Cookie请求头中带回服务器。

6.什么是CORS(跨源资源共享)?在HTTP头中是如何实现的?

CORS是一种机制,它使用额外的HTTP头来告诉浏览器让运行在一个origin(domain)上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨源 HTTP 请求。

为了解决这个问题,服务器可以在响应头中包含一个Access-Control-Allow-Origin字段,表示哪些域名可以访问该资源。例如,Access-Control-Allow-Origin: *表示所有域名都可以访问该资源。

lukaliou123 commented 2 years ago

20.常用网络协议

1、DNS协议(应用层) DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。 作用: ● 该协议主要负责将域名转换成网络可以识别的IP地址(www.cce.com.cn转换成221.122.32.15),域名和IP地址是一一对应的。 ● 因为访问网站的时候,最终都是转换成IP地址进行访问的 ● 直接设置DNS服务器。可以提高网络的访问速度,保证访问的正确性

DNS的两种查询方式:递归查询和迭代查询 a)递归解析 当局部DNS服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式,如图所示的是递归方式。局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。

b)迭代解析局部DNS服务器自己不能回答客户机的DNS查询时,也可以通过迭代查询的方式进行解析,如图所示。局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查。比如说:baidu.com的服务器ip地址在192.168.4.5这里,你自己去查吧,本人比较忙,只能帮你到这里了。

2、HTTP协议 超文本传输协议( Hyper Text Transfer Protocol ) 定义:● 是用于从万维网(www)服务器传输超文本到本地浏览器的传送协议 ● 是 基于TCP/IP通信协议来传递数据(HTML、图片、查询结果等)的协议 ● 是一个属于应用层的、面向对象的协议 ● 由于其简捷、快速的适用于分布式超媒体信息系统 工作原理:HTTP协议工作在客户端-服务端架构上。 浏览器作为HTTP客户端通过URL向HTTP服务端(即WEB服务器)发送请求, WEB服务器根据接收到的请求后,向客户端发送响应信息。

3、SSL/TLS协议(OSI中的会话层和表示层,TP/IP中的应用和传输之间)SSL(Secure Sockets Layer),安全套接层。上世纪90年代由网景公司设计。原先互 联网使用的HTTP协议是明文的,存在很多缺点(传输内容会被偷窥(嗅探)和篡改)。 SSL就是为了解决这些问题 ● 到了1999年,SSL因为广泛应用,已经成为互联网上的事实标准。IETF就在那一年把 SSL标准化,标准化名称改为TLS(Transport Layer Security),传输层安全协议 ● SSL和TLS是同一个东西的不同阶段

4、websocket协议 1)WebSocket 是Web应用程序的传输协议,是一个Html5协议,它提供了双向的,按序到达的数据流 2)WebSocket的连接是持久的,他通过在客户端和服务器之间保持双工连接,服务器的更新可以被及时推送给客户端,而不需要客户端以一定时间间隔去轮询 3)WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。 4)WebSocket 只需要建立一次连接,就可以一直保持连接状态,这相比于轮询方式的不停建立连接显然效率要大大提高

lukaliou123 commented 2 years ago

21.SOCKET的通信流程

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。

补充:Socket是什么 Socket是应用层与传输层的一个抽象,将复杂的TCP/IP协议隐藏在socket接口后,只对应用层暴露简单的接口.

socket是一种特殊的文件,它也有文件描述符,进程可以打开一个socket,并且像处理文件一样对它进行read()和write()操作,而不关心数据是怎么在网络上传输的。 socket是一个tcp连接的两端。

流程 服务器端

  1. 创建socket,表示有一个电话
  2. 绑定socket和端口号,相当于,电话对应了一个电话号码
  3. 监听端口号,相当于,把电话插上电话线,可以随时等待有人拨通电话
  4. 接收客户端的连接请求,相当于有人打来了电话
  5. 从socket中读取字符,相当于,接起电话,有语音信息传输过来了
  6. 关闭socket,相当于通话完成后,挂掉电话

客户端: 1.创建socket,表示有一个电话(也默认绑定了端口号) 2.连接指定的计算机端口(服务器的地址和端口),相当于拨打电话 3.向socket中写入信息,相当于给对方说话 4.关闭socket,相当于通话完成后,挂掉电话

KPXINHI@SHYN 9X4E@5WXIT

lukaliou123 commented 2 years ago

22.WebSocket

1.是什么 WebSocket,是一种网络传输协议,位于OSI模型中的应用层。可在单个TCP连接上进行全双工通信,能更好的节省服务器资源和带宽并达到实时通迅

全双工:允许数据在两个方向上同时传输 半双工:可以双向传输,但是同一时刻只能一个方向传输 半工:单向传输数据

2.特点 ● 与http协议有良好的兼容性 ● 建立在TCP协议之上,与http同属于'应用层 ● 数据量小、性能开销小、通信高效 ● 可以发送文本和二进制 ● 可以与任意服务器通信 ● 握手阶段采用http协议,默认端口是80和443 ● 协议标识字符ws、加密wss ● 服务器可以主动向客户端请求

3.与其它协议的区别 WebSocket和Socket的区别 WebSocket拥有完整的应用层协议,包含一套标准的API Socket是一组接口,是应用层与TCO/IP协议通信的中间软件抽象层

HTTP与WebSocket区别 1.http是短连接,请求之后会关闭连接 2.WebSocket长连接,只需通过一次请求初始化连接,然后所有的请求和响应都是通过这个TCP连接进行通信

应用场景 基于websocket的实时通信的特点,其存在的应用场景大概有: 弹幕 媒体聊天 协同编辑 基于位置的应用 体育实况更新 股票基金报价实时更新

协议名 引入ws和wss分别代表明文和密文的websocket协议,且默认端口使用80或443,几乎与http一致 ws://www.chrono.com ws://www.chrono.com:8080/srv wss://www.chrono.com:445/im?user_id=xxx

lukaliou123 commented 2 years ago

23.ARP协议

ARP协议的全名是Address Resolution Protocol。简单的说ARP协议的功能就是根据目标设备的IP地址找到目标设备的MAC地址OBRDUS5RM {IFWSFWK2M8)B 在解释ARP工作原理之前,先解释一个概念,之前已经说过真正的数据包是要在物理设备上传输的,而直接在物理设备上传输的也不是ARP分组,ARP分组还要先封装成数据链路帧然后[物理层]才会将数据链路帧发送出去,下面来看一下数据链路帧的结构:

工作原理

1.首先,每个主机都会在自己的[ARP]缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。 2.当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本[网段】的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。 3.当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址 4.源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

lukaliou123 commented 1 year ago

24.粘包和拆包

TCP是面向字节流的协议,就是没有界限的一串数据,本没有“包”的概念,“粘包”和“拆包”一说是为了有助于形象地理解这两种现象。

为什么UDP没有粘包粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。

24.1. 粘包拆包发生场景

因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化,例如缓冲区为1024个字节大小。

如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。

如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包。

关于粘包和拆包可以参考下图的几种情况image 上图中演示了以下几种情况:

1.正常的理想情况,两个包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包; 2.粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送; 3.拆包:一个包过大,超过缓存区大小,拆分成两个或多个包发送; 4.拆包和粘包:Packet1过大,进行了拆包处理,而拆出去的一部分又与Packet2进行粘包处理。

24.2.常见的解决方案

对于粘包和拆包问题,常见的解决方案有四种:

1.发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度; 2.发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议; 3.将消息分为头部和消息体头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息; 4.通过自定义协议进行粘包和拆包的处理。

24.3.Netty对粘包和拆包问题的处理 Netty对解决粘包和拆包的方案做了抽象,提供了一些解码器(Decoder)来解决粘包和拆包的问题。如:

LineBasedFrameDecoder:以行为单位进行数据包的解码; DelimiterBasedFrameDecoder:以特殊的符号作为分隔来进行数据包的解码; FixedLengthFrameDecoder:以固定长度进行数据包的解码; LenghtFieldBasedFrameDecode:适用于消息头包含消息长度的协议(最常用); 基于Netty进行网络读写的程序,可以直接使用这些Decoder来完成数据包的解码。对于高并发、大流量的系统来说,每个数据包都不应该传输多余的数据(所以补齐的方式不可取),LenghtFieldBasedFrameDecode更适合这样的场景。

小结 TCP协议粘包拆包问题是因为TCP协议数据传输是基于字节流的,它不包含消息、数据包等概念,需要应用层协议自己设计消息的边界,即消息帧(Message Framing)。如果应用层协议没有使用基于长度或者基于终结符息边界等方式进行处理,则会导致多个消息的粘包和拆包。

虽然很多框架中都有现成的解决方案,比如Netty,但底层的原理我们还是要清楚的,而且还要知道有这么会事,才能更好的结合场景进行使用。