计算机网络面试总结


websocket和socket的区别:
1.socket: 套接字,socket是在应用层和传输层之间的一个抽象层,把TCP/IP的复杂操作抽象为几个简单接口供应用层使用。

2.websocket:基于TCP的一种新的网络协议,和http协议一样属于应用层协议,让客户端和服务器之间进行双向实时通信的技术。

七层网络模型,

从底层到上层: 物理层-数据链路层-网络层(ip协议)-传输层-应用层(会话层,表示层,应用层)。。


网络层(主机之间):
IP协议非常简单,仅仅提供不可靠、无连接的传送服务
1> 网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能;
2> 基本数据单位为IP数据报
3> 包含的主要协议:
IP协议(Internet Protocol,因特网互联协议);
ICMP协议(Internet Control Message Protocol,因特网控制报文协议);
ARP协议(Address Resolution Protocol,地址解析协议)可看成是跨网络层和链路层的协议;
RARP协议(Reverse Address Resolution Protocol,逆地址解析协议)。
重要设备:路由器。。

IP协议如何保证数据接收完毕?
IP协议是无连接协议,不会考虑对方是否“发送完毕”。如果IP数据报被分片发送,那么只有最后一个分片的“还有分片(M)”flag置为0,之前的分片相应flag都置为1。

ip地址分类::
ip地址分网络号和主机号, ip地址由4段组成,每一段是一个字节(8位),最大值是255
网络号表示其属于互联网的哪一个网络,主机地址表示其属于该网络的哪一台主机。(主从关系)
ip共32位,4个字节,点分十进制记法。
(1)A类地址:1个字节(8位,0+7位)表示网络号,网络号取值范围1~126,一般用于大型网络
后3个字节是主机号,(子网掩码255.0.0.0)
(2)B类地址:2个字节(16位,10+14位)表示网络号
网络号取值为128~191,一般用于中等规模网络。子网掩码(255.255.0.0)
(3)C类地址:3个字节(24位,110+21位)表示网络号,网络取值192~223,一般用于小型网络,子网掩码(255.255.255.0)
(4)D类:以1110开始,用于组播(网络取值224~239,用于多路广播用户)
E特殊地址(用于科研),全1和全0保留不用。

子网掩码(subnet mask),又叫网络掩码、地址掩码、子网络遮罩,用来指明一个ip地址的哪些位标识的是主机所在的子网,哪些位标识的是主机的位掩码。
子网掩码必须结合ip地址一起使用。 作用是将某个ip地址划分为网络地址和主机地址2部分,屏蔽ip的一部分来区分网络标识和主机标识,并说明该ip在局域网还是在公网。
屏蔽ip的网络部分,A类默认子网掩码255.0.0.0


网络层和传输层的区别:
(1)网络层:只是根据网络地址将源结点发出的数据包传送到目的结点,
(2)传输层:则负责将数据可靠地传送到相应的端口。

传输层(具体的端口,具体应用):TCP、UDP
为应用进程之间提供端到端的逻辑通信。
1> 传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和流量控制问题;
2> 包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议,传输的是报文)、UDP协议(User Datagram Protocol,用户数据报协议,传输的是数据报);
3> 重要设备:网关。


TCP协议

TCP应用场景:网页 邮件等等。(http、ftp、telnet、

TCP数据格式: (如下图所示)面向字节流,将信息分割成组,接收端进行重组。

TCP是基于字节流,没有边界,容易发生tcp 粘包和拆包
1.TCP粘包:指的是发送方在发送数据时,将多个逻辑上独立的数据包粘合在一起发送,导致接收方在接收时无法正确地区分这些数据包。造成TCP粘包的原因有多种,包括网络传输的延迟、缓冲区的限制、发送方的发送策略等。
多个数据包粘合在一起,形成一个大的数据包。
多个数据包合并成一个数据包,但是在接收端无法正确地解析出每个数据包。
2.TCP拆包: 发送方在发送数据时,将一个逻辑上独立的数据包拆分成多个小的数据包发送,导致接收方在接收时无法正确地组装这些数据包。TCP拆包的原因主要是由于发送方发送数据的速度过快,接收方处理数据的速度没有跟上。
一个数据包被拆分成多个小的数据包,接收方无法正确地组装这些数据包。
一个数据包被拆分成多个小的数据包,但是在接收端可以正确地解析出每个数据包。

解决TCP粘包和拆包的方式:
1.定长包:固定长度发送,根据固定的长度进行数据的解析;
2.分隔符包:发送方在发送数据时,在每个数据包的末尾添加一个特定的分隔符,接收方按照这个分隔符进行接收和解析。这样可以保证每个数据包的完整性,但是需要选择一个合适的分隔符,避免与数据内容冲突。
3.消息头部包含长度信息。即发送方在发送数据时,在每个数据包的头部添加一个固定长度的字段,表示该数据包的长度,接收方先接收这个长度字段,再根据长度字段接收相应长度的数据。这样可以确保接收方能够正确地区分和组装数据包。
4.序列化和反序列化:即发送方在发送数据之前,将数据对象序列化为字节流,接收方在接收数据之后,将字节流反序列化为数据对象。通过序列化和反序列化,可以确保数据的完整性和正确性。

报文格式:报头header+数据
TCP格式:
(1)报头 16位源端口号 + 16位目的端口号,
(2)32位序号(标识TCP发送端向TCP接收端发送的数据字节流)
(3)32位确认序号(SYN报文,ACK标志为0,没有确认序号)
(4)首部长度, 标志位,
(5)窗口大小(TCP流量控制,连接的每一端声明窗口大小,即接收缓冲区大小)
(6)校验和,(发送端计算存储,接收端验证)
;(udp没有分组开销)
tcp 提供拥塞控制,和流量控制。
在这里插入图片描述
标志位: 共有6种标志位,SYN(建议连接, 三次握手需要),ACK(用来确认, 建立连接 关闭连接都需要),PSH(传输), FIN(结束, 四次挥手需要), RST(重置), URG(紧急)
SYN:同步标志, 同步序列编号栏,仅在三次握手时有效。
ACK:确认标志, 确认编号栏,大多数情况是置位。

为什么 TCP 叫数据流模式? UDP 叫数据报模式?
TCP: 所谓的“流模式”,已经建立连接了,像流一样,发送一次,可以分批接收,直到接收完毕!! 是指TCP发送端发送几次数据和接收端接收几次数据是没有必然联系的,比如你通过 TCP连接给另一端发送数据,你只调用了一次 write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。
原因:这是因为TCP是面向连接的,一个 socket 中收到的数据都是由同一台主机发出,且有序地到达,所以每次读取多少数据都可以。
UDP: 所谓的“数据报模式”,是指UDP发送端调用了几次 write,接收端必须用相同次数的 read 读完。发送一次,读一次。 UDP是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。
原因:这是因为UDP是无连接的,只要知道接收端的 IP 和端口,任何主机都可以向接收端发送数据。 这时候,如果一次能读取超过一个报文的数据, 则会乱套。

TCP建立连接(客户端和服务端)
1. 三次握手流程,建立连接; (socket编程中,由客户端调用connect接口来实现)
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,SYN是否为1,如果正确则将标志位SYN置为1,ack=J+1,并将该数据包发送给Server,Server检查ack是否为J+1,SYN是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

2.四次挥手流程,关闭连接。(socket编程中,close接口来实现)
四次挥手的过程:需要客户端和服务端总共发送4个包以确认连接的断开。该过程由客户端或服务端任一方执行close来触发。两个方向上都必须发送FIN。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。(状态位FIN=1,发送seq=J)
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。(状态位ACK=1,发送ack=J+1)
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。(状态位FIN=1,发送seq=K)
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。(状态位ACK=1,ack=K+1)
注意此时客户端并未进入CLOSED状态,为了防止服务延迟,需要等待2MSL的时间,然后进入CLOSED状态,因为如果客户端直接进入CLOSED了,如果网络异常,客户端就不能重重发数据。


建立连接是三次,关闭连接却是四次??
答:(1)建立连接时,服务端在listen状态下收到SYN建立连接请求时,服务端把ACK和SYN放在一个报文里发送给客户端。关闭连接时,收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,自己也未必全部数据都已经发送给对方了;所以己方可以立即close,也可以发送数据后再发送FIN给对方表示同意现在关闭连接。。
己方 ACK 和 FIN 一般分开发送。。

四次挥手的解释:其实是客户端和服务端的两次挥手,也就是客户端和服务端分别释放连接的过程

为啥建立连接必须三次,不能是二次或四次???
三次是理论上的最小次数。。tcp必须建立连接 。。只有三次,才能证明client和server分别验证双方都具有正常的发送和接收能力。
四次太多,浪费资源,传输效率低。。。(使用理论最小值即可,三次。。)


主动发起关闭的一方是time_wait, (TCP可靠性的体现。。) time_wait的意义:!!!
原因:要经过2MSL(最大报文段生存时间返回变成close状态)

  1. 保证TCP的全双工连接都能够可靠关闭;(保证server正常关闭,收到server的ACK才放心,)
  2. 保证这次连接的重复数据段,从网络中消失。(防止新连接 旧链接数据混淆, 等旧链接的数据全部消失。。)

MSS(Maximum Segment Size,最大报文段长度)三次握手有一个目的就是协商MSS大小。 一般来说,TCP报文携带的数据越多越好,网络传输底层数据链路层不能太大。
MTU,Maximum Transmission Unit,最大传输单元,链路层对这种帧长度的限制。
MTU是硬件层面属性 限制, MSS是软件层面,软件控制

机器上出现大量TIME_WAIT的原因和解决方法:
主动请求断开的一方必然会出现TIME_WAIT,是正常现象,且会定时回收(2MSL时间,自动消失)。
根本原因:持续、大量的短连接,高并发场景下,(不停的在建立连接、关闭连接)
使用长连接。

在这里插入图片描述


TCP可靠性如何保证?
1.连接管理 ,保证连接传输可靠。 三次握手, 四次挥手,是保证可靠性的前提。
2.校验和 (保证数据准确)
计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。
发送方:在发送数据之前计算检验和,并进行校验和的填充。
接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对;
3.序列号 :TCP将每个数据包都进行了编号,这就是序列号。
序列号的作用:
a、保证可靠性(当接收到的数据总少了某个序号的数据时,能马上知道)
b、保证数据的按序到达
c、提高效率,可实现多次发送,一次确认
d、去除重复数据
4.确认应答
TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
5.TCP引入了超时重传机制
发送方没有介绍到响应的ACK报文原因可能有两点:
数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。
接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。
TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

1.TCP流量控制 : 防止发送数据过快 ,接收方来不及接收。
流量控制:只是点对点的,两端之间的问题,抑制发送端的发送速率。使接收端来得及接收。
(发送方和接收方速度不相等,接收方来不及处理的数据放在缓冲区,缓存区满的时候,会丢掉一部分包, 因此需要控制发送方的发送速率)

流量控制方法: 接收方给发送方发送确认报文时,带上win的大小(缓存区剩余空间大小,接收方窗口大小,单位是字节)
发送方收到之后,便会调整自己的发送速率;如果收到为0时(说明接收方没有空间了),发送方便不再发送。
、、、、、、、
win=0时,何时继续发送?
发送方定时去给接收端发送测试信息, (接收端也可以给发送端发送win>0的消息。。)

、、、、、
窗口大小,根据某种算法动态调整(根据网络环境、发送端发的拥塞窗口)。。 窗口太大也不好消耗大量内存),太小也不好(降低链路利用率,容易丢包) 接收窗口>=发送窗口
TCP滑动窗口,就是进行流量控制的方式。接收方设置滑动窗口大小(单位字节),发送方不得超过该大小。(发送滑动窗口 ACK=1)

2.TCP拥塞控制
对资源的需求 超过了网络可以供应的资源, 网络中很多资源不足,网络性能就会明显变差,
防止过多数据注入到网络中,防止网络过载。

拥塞控制是一个全局的工作,主机 交换机等,都要考虑。涉及整个网络性能。(前提要知道网络中流量分布情况)
拥塞控制的代价:节点之间交换信息和各种命令,以便选择控制的策略和实施控制,会产生额外的开销。拥塞控制还会将一些资源分配给各个用户单独使用,使得网络资源不能更好的实现共享。
、、、、、
常用的拥塞控制的方法:
(1)慢开始: slow-start
发送方维持一个拥塞窗口cwnd状态变量,拥塞窗口大小取决于网络拥塞程度,并且动态的变化。发送方让自己的发送窗口等于拥塞。
只要网络没有拥塞,拥塞窗口就可以增大一些,把更多的分组发送出去;网络出现拥塞,窗口就减小一些。
慢启动:开始时cwnd=1(开始只发送一个分组), 然后逐步加倍,
慢启动门限状态变量 ssthresh,
超过该变量:用拥塞避免算法;
小于该变量:用慢启动算法。
(2) 拥塞避免: 每次cwnd +1, 缓慢增长,不是加倍。
出现拥塞时, 都会把分组数减少一半。
(3)快重传: 要求接收方每收到一个失序的报文段后就立即发出重复确认(尽早的让发送方知道,有报文段没有到达对方),
一连收到3个重复确认,立即重传对方尚未收到的报文段,
(4)快恢复: 慢启动门限状态变量 减半。。

(上面操作, 避免网络拥塞,提高网络吞吐量。。)

tcp连接中,解决异常断开的问题:
引入心跳机制,设计一个线程,定时发送心跳包,收到返回时确认对方是否在线。(业务层做心跳包比较好)

TCP传输顺序如何保证?
(1) 数据划分为片段来传输,
TCP协议将数据切分为多个小片段(数据被划分为合理长度),小片段由头部(header)和数据(payload)组成,为了确保抵达数据的顺序,TCP协议给每个片段的头部(header)都分配了序列号,方便后期按照序列号排序。
(2)缓冲区, 当某个片段按照顺序发送后,发送方会将已发送的数据片段暂时保存在缓冲区内,并为每个已发送的数据设置一个时间区间。
(3)主要依靠序列号。 当接收方收到正确的符合顺序的数据片段后,会优先对数据片段做完整检验,如确认无误,再把数据片段交给上层协议,并给发送方一个TCP片段反馈信息用来告知(ACK acknowledge)发送方:我已经接收到这个片段了。这个TCP片段被称为ACK回复。举个例子:发送的第一个片段序列号为T,其对应的ACK回复则为T+1,也就是接收方要接收的下一个发送片段的序列号。
(4)后处理。 假设在规定的时间区间之内发送方收到接收方的TCP片段反馈信息,则发送方可以释放缓冲区的数据,如若超时未收到应答,发送方则重新发送数据,直到收到应答,或者重发数据次数达到上限为止。


UDP协议
UDP适用场景:语音、视频等场景,对速度要求高。
UDP对应的协议:

DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。(UDP协议)
SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。(UDP协议)
TFTP(Trival File TransferProtocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

udp不会发生粘包和拆包(udp基于报文,首部指出报文长度),应用层可以很好的将不同数据报文区分开。避免粘包拆包。

UDP数据格式: (如下图所示) 头结构。
分为首部字段 和 数据字段
(1)首部字段:占用8个字节,源端口、目的端口、长度和校验和。
(1.1)16位源端口号 记录源端口号,在需要对方回信时选用。不需要时可用全0。
(1.2)16位目的端口号 记录目标端口号。这在终点交付报文时必须要使用到。
(1.3)长度 UDP数据报的长度(包括数据和首部),其最小值为8B(即仅有首部没有数据的情况)。
(1.4)校验和 检测UDP数据报在传输中是否有错,有错就丢弃。该字段时可选的,当源主机不想计算校验和,则直接令该字段为全0。当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交给进程。如果接收方UDP发现收到的报文中目的端口号不正确(即不存在对应端口号的应用进程),就丢弃该报文,并由ICMP发送“端口不可达”差错报文交给发送方。
(2)首部和数据一起计算校验。
在这里插入图片描述

1.udp协议是无连接的,传输数据前不需要建立连接,当然也没有不需要释放连接。
2.尽最大努力交付,udp无法保证数据能准确交付到目的主机,也不需要对接收到的udp报文进行确认。不安全, 没有确认机制、没有重传机制。
2.5 没有发送缓冲区,没有重传机制,所以不需要发送缓冲区(拿到直接发送)
3.面向报文,udp将应用层传下来的数据不进行拆分合并,原封不动的发送过去。
4.没有拥塞控制,udp协议发送速率不受网络的拥塞影响。
5.udp比较小,包里面包的字段少。
6.支持1对1、1对多、多对1、多对多的交互通信。

UDP如何实现可靠传输
UDP不属于连接协议,资源消耗少,处理速度快;
传输层无法保证数据可靠传输,只能通过应用层实现(实现方式一般也是参考tcp的操作)
应用层udp可靠传输设计:
1.添加seq , ack机制, 确保数据发送到对方;
2.添加发送方和接收方的缓冲区,
3.定时检查任务 是否需要重传数据。
开源的可靠传输的UDP程序:1.RUDP(Reliable UDP,对拥塞控制的改进,重发机制)2.RTP(Real Time Protocol),3.UDT(UDP-based Data Transfer Protocol)


应用层
应用层:FTP、SMTP、DNS、HTTP、Telnet(远程网络访问协议) 等等很多开发的应用层协议。

会话层:管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。

会话层、表示层和应用层重点:
1> 数据传输基本单位为报文;
2> 包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。


http协议
http:(HyperText Transfer Protocl,超文本传输协议), 网络应用层最广泛使用的一种网络协议,所有www文件必须遵守这个标准,发送传输html文件使用。底层基于TCP传输协议。
http 无连接(每次只处理一个,结束就断开,节省传输时间),无状态(也是提高响应,前后处理都是独立的,没有记忆,不会记忆上下文。。)
http结构: 请求报文 = 请求行(url) + 请求头header + 请求体body
https://www.cnblogs.com/lifan1998/p/14325065.html?utm_source=tuicool
header:
connection: 是否需要持久连接。 keep-alive或http1.1就表示进行持久连接。
keep-alive: 可以设置连接的时间(在该时间内,连接不会断开)
!!content-length: web服务器返回消息正文的长度(动态页面用transfer-encoding!!!) 用来判断消息大小,读取处理是否完毕。。。!!!
content-type: 返回数据类型和字符编码格式。
Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。

3.HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
(1)建立TCP连接;(2) Web浏览器向Web服务器发送请求命令;(3)Web浏览器发送请求头信息;(4)Web服务器应答;(5) Web服务器发送应答头信息;(6)Web服务器向浏览器发送数据;(7)Web服务器关闭TCP连接

http的两种模式:
(1)普通模式:非Keep-alive模式,每次请求应答都新建一个连接,完成后断开连接(http协议是无连接的协议)
(2)keep-alive模式:持久连接,连接重用, 客户端到服务器端的连接持久有效,出现对服务器的后继请求时,避免重新建立连接

https 是 http的安全版,http中加入SSL层(依靠证书来验证身份,为浏览器和服务器直接提供通信加密) 端口443

http状态码:
在这里插入图片描述
200:表示服务器响应成功,找到了内容,并且将内容返回给客户端;
302:代表临时跳转,不是永久性的,还会重定向到其它地址;
301:重定向状态码。
403:请求服务器资源权限不够,或者请求的ip地址被封掉了。
404: 服务器上没有该资源,最常见的错误码。 找不到。
500:程序错误,请求的网页程序本身报错了(服务器内部错误,Internal Server Error),(一般会返回一个程序本身定制的页面)程序代码出问题。
501:
502:服务器上的一个错误网关,(Bad Gateway)说明它是无效的,一般清除下缓存或者服务器刷新试试。服务器代理出问题。
503:Service Unavailable。 服务不可用。 服务正在维护更新暂停等等,或者cpu占用频率过大。
504:Gateway-timeout,网关超时。
505:http版本不受支持。

https保证传输安全:

  1. 加密: 使用非对称加密密钥对对称加密密钥进行传输。首先服务器使用非对称加密算法生成公私钥a、b,将公钥a传输给浏览器(客户端),客户端会使用对称加密算法生成一个密钥c,客户端使用a加密c生成d,然后将加密后的信息d传输给服务器,服务器使用私钥b对传输来的d进行解密,得到对称加密的公钥,双方就可以开始通信了。
  2. 身份验证:通过CA证书进行通信双方身份的验证。
  3. 对称加密, 对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。
    常见的对称加密算法:DES,AES,3DES等等。
  4. 非对称加密,非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。
    常见的非对称加密算法:RSA,ECC

浏览器输入网址,访问服务器,用的啥协议,详细过程是啥????
1.域名解析协议DNS,将url解析成ip地址,(dns是属于udp协议)(先查dns缓存,缓存没有就请求dns服务器)
2.tcp连接,与服务器三次握手,建立tcp连接。
3.http协议,得到ip后,浏览器和服务器建立http连接,向服务器发送http请求;返回http回应;服务器产生get报文请求,tcp协议处理(后面就一层层往深处去,服务器从底层一直往上解析)
4.浏览器解析并渲染页面
5.断开tcp连接。


FTP服务器??? 文件传输协议
底层tcp传输层建立连接, ftp加了一些功能:身份认证、浏览主机目录信息、维护多个tcp连接状态(文件传输结束时关闭,再次传输时重新建立)


DNS(Domain ):域名解析服务。
用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。

ping命令:
命令本身是一个应用程序,属于应用层。
底层使用的是ICMP协议(Internet Control Message Control),用于在ip主机和路由器之间传递控制消息,网络状况 主机状况 等等, 属于网络层。


Socket编程

connect(相当于3次握手过程。)
close(四次挥手,客户端或服务端任一方触发)
客户端:
(1)socket(), 创建一个socket;设置ip和prot,
(3)connect(), 连接服务器。
UDP 用 struct sockaddr。
(4)send() 和 recv(), 收发数据, 或read()和write()
(read write是linux最底层的读写操作,往fd缓冲区写内容;send, recv增加了flag字段,可以选择模式。。)
UDP recvFrom(), sendTo().
(5)close(), 关闭连接。。

服务端:
(1)socket(), 创建一个socket;
(2) bind(), 设置ip和prot,
(3)设置允许的最大连接数,listen()
(4) 接收客户端上来的连接, accept()
accept 从已完成连接队列头返回下一个已完成连接。输入参数为:连接放进程协议地址(fd,地址和长度),成功时生成返回全新的描述符,表示与客户的连接。

(4)send() 和 recv(), 收发数据, 或read()和write()
UDP recvFrom(), sendTo().
(5)close(), 关闭连接。。

如何优雅的关闭连接。
https://blog.csdn.net/sunximei/article/details/119837753
网络编程中的close不优雅,
tcp将字节流分段打包(tcp数据包),一个包内的数据不是完整的消息(依靠seq(顺序)、ack(确认)来进行同步)
close不优雅的原因:是因为当fd句柄引用引用计数为0时,close关闭套接字直接返回,即使TCP发送缓冲区还有数据未发送完毕,即使TCP接收缓冲区还有数据未读取完毕。
shutdown: 终止连接,不关闭套接字。(直接触发tcp终止,发送FIN包)
优雅的方式:
使用setsockopt设置linger。
shutdown(不接受但可以发送)然后closesocket(不能接受也不能发送)

socket函数, TCP和UDP发送同样的1M数据到接收端,有啥区别???
主要回答TCP和UDP的区别即可。

socket通信流程:
两个进程能够进行通信的方法:就是在网络中唯一标识一个进程。网络中唯一标识一个进程就是用 ip + 协议 + 端口,标识完两个进程就可以用socket通信了。

socket:套接字,是在应用层和传输层之间的一个抽象层,把tcp/ip复杂的操作流程 抽象成为几个简单的接口,供应用层调用,从而实现进程在网络中的通信。

网络编程中,send函数怎么实现。。阻塞和非阻塞。。
https://www.cnblogs.com/inception6-lxc/p/9152691.html 网络每个层介绍。
TCP 滑动窗口机制, 拥塞机制, 流量控制。。???

send实现原理: socket发送消息。
(1)先比较待发送数据的长度和套接字的发送缓冲区的长度:大于缓冲区,直接报错;
(2)检查协议是否正在发送socket缓冲区数据:在发送的话,就等待协议发送完,再拷贝;没发送的话,就比较剩余空间长度和数据长度。
(3)拷贝到socket缓冲区。 拷贝过程还会出现错误。
(4)协议发送,还会出现网络错误。
send只负责把数据拷贝到socket缓冲区,发送还是靠协议完成。

recv实现原理: socket接收消息。
(1)接收缓冲区没有数据,或协议正在接收数据,recv就一直等待;
(2)协议接收完毕,把接收缓冲区数据拷贝到用户buffer中。
recv只是拷贝数据,真正的接收数据还是协议完成。 协议先接收,recv拷贝到用户buffer。


RPC框架

RPC:(区别于http的一种),服务间的远程调用的方式,(Remote Produce Call), 早起webservice就是基于RPC的典型案例。 工作在会话层(跨越了传输层和应用层)
特点:基于原生TCP通信,速度快,效率高,自定义数据格式,
报文体积小,传输效率高;可以基于thrift实现高效的二进制传输。。。自带负载均衡策略。。
是什么?? 一种进程间的通信方式,允许像调用本地服务一样调用远程服务。(只管调用就行,不用管通信、传输、编码格式细节。。)只需要关心谁、在什么位置、提供了什么样的接口服务即可。
RPC和http:底层都是基于socket(socket是封装了TCP通信)。http的话,就封装的httpclient。都可以实现远程调用,服务调用服务,

不同点:http通用性比较强,只需要json restful风格的数据即可。。(http协议数据封装太臃肿。。http更灵活。
rpc:需要双方都使用同一语言,同一框架的rpc协议,调用很快,处理速度也很快。rpc实现难度较大。rpc比较定制化。(对效率要求更高,统一技术栈,建议用rpc)
但是,微服务强调自治,独立,灵活,rpc不太符合。。http restful更适合微服务。。

rpc实现:
RPC框架图:

Server: 服务提供方; Client: 服务消费方。Registry:服务注册与发现的注册中心。
服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表;
服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;
在这里插入图片描述
RCP框架流程:
在这里插入图片描述
1.Proxy代理层: 用于对象的代理;对象的反射调用;RPC流程的控制。
2.Serialize序列化层; 将请求序列化和结果反序列化。
3.Invoke网络模块; 主要用于网络通信的相关处理。
4.Container容器组件; 这层主要用于代理层监听网络请求。
RPC的优势在于,定义了一套框架,里面的技术可以自己选,比如序列化和反序列化,用高效的方式;比较灵活。。。
五、使用到的技术
1、动态代理: 生成 client stub和server stub需要用到 Java 动态代理技术 ,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。
2、序列化:为了能在网络上传输和接收 Java对象,我们需要对它进行 序列化和反序列化操作。

  • 序列化:将Java对象转换成byte[]的过程,也就是编码的过程;
  • 反序列化:将byte[]转换成Java对象的过程;
    可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack
    3、NIO:当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。
    4、服务注册中心 可选技术: * Redis * Zookeeper * Consul * Etcd

感觉最大优势在于protobuf(protocol buffers)
是一种语言无关、平台无关、可扩展的序列化结构数据的方法,用于数据通信协议、数据存储。
存储体积小3-10倍,传输效率快20-100倍。更简单。
数据序列化 面向通信 存储。。(效率 压缩)
(protobuf 优化原理:
1.针对int型,采用变长传输方式,(不局限于4个字节)
2.不传输属性名,用int型的tag
3.不传输多余的字符,比如json中大量花括号。
大部分场景下,比json效率高。


大型网络游戏 一般采用UDP传输协议,传输速度快,不会浪费时间和带宽。对丢失的包进行重传。
TCP适合回合制等节奏慢的游戏,比如炉石传说。
https://blog.csdn.net/tajianyi2338/article/details/108218896 (多人游戏网络同步技术)
https://blog.csdn.net/a352614834/article/details/95003429 (网络同步技术理解)
https://zhuanlan.zhihu.com/p/56923109 (网络游戏同步技术概述)
网络同步:主要有2种,帧同步和状态同步。
1.帧同步:帧锁定同步算法。客户端和客户端每一帧发送 cmd,客户端收到所有输入后,根据这些cmd模拟一帧。网络延迟和网络状况最不好的玩家有关。
2.状态同步:服务器每一帧把客户端的输入收集并计算结果发送给客户端,客户端只负责表现结果。

命令同步:要即时同步,比如用户移动。
状态同步:可以按照一定频率 区分细节度发送。

同步对象:同服,同屏, 单个用户。。

对象同步:增量同步(第一次创建对象需要完整的信息,以后只是少量变化量即可)减少冗余数据传输。
关键游戏逻辑尽可能在服务端完成,做好加密,防止攻击。输入校验。。

对不同数据 采用不同的同步机制(消息分的十分细腻)小规模游戏 实时性可以要求高一些,大规模存在网络延迟,不存在“完全同步”。(消除 或者 隐藏延迟,玩家感受起来像没有延迟)

多路复用。。
多个TCP连接,复用指复用一个或少量线程,很多网络I/O复用一个或少量的线程来处理这些连接。
都是异步的事件驱动的网络模型,
———//

—————

1。epoll(linux)
任务队列中的任务,需要主动触发执行,

iocp。(window)
客户端发送过去到队列中,IOCP自动执行,通过一个接口获取完成事件通知即可(给子进程。。)
网络相关
!!!!!
----——————-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值