一.基础篇
同一台设备上的进程间通信,我们可以采用管道,消息队列,共享内存,信号等方式。而对于不同设备的通信,采用网络协议。
应用层:只给用户提供应用功能,不要关心怎么传输的。
应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。
传输层:有两个传输协议,主要是TCP和UDP。只需要服务应用,作为应用间传输媒介,实现应用到应用的通信,
TCP:大部分应用如HTTP都是使用的TCP传输层协议,TCP比UDP多了很多特性,比如流量控制,超时重传,拥塞控制。
UDP:只负责发送数据包,不保证到达。实时性性好,也可以实现可靠传输,把TCP的特性在应用层上实现就可以。
TCP段的出现是为了解决传输数据过大导致的控制不方便,分块后即使丢了或损坏也只需要重传这一个分块,不用整个重新发送。
端口的出现是因为如果一台设备上很多应用在接收或者传输数据,需要一个编号发应用区分好让接收方知道报文应该发送给哪个应用,端口号在传输层的报文中。
网络层:负责实际的传输,比如接收方中间有很多网络线路和分岔路口,都是网络层负责。最长使用的协议是IP,IP协议将传输层的报文作为数据部分,再加上IP包头组装成IP报文。
网络层也会进行分片
如何找到对方,因此网络层需要区分设备的编号,设备的编号我们用IP地址区分,对于IPv4协议,IP地址共32位,分为4段。这样虽然能区分,但是还是很麻烦,需要一个一个匹配。因此IP地址分成网络号和主机号,网络号负责表明IP地址是哪个子网的,而主机号就是分别同一子网下的不同主机。这是怎么分的?
需要借助子网掩码,先找到匹配的网络号再去找对应的主机。
上面这些是IP的寻址能力,IP还有一个能力是路由。所谓路由就是由于实际两台设备不是一条网线连接的,而是通过很多网关,路由器,交换机等连接起来的,有很多路径,因此数据包到达一个网络节点就要通过算法决定下一步路径。
综上,IP的寻址就是告诉我们下个目的地朝哪个方向走,就像导航,而路由就是选择去方向地的路径是哪一条。
数据链路层:数据不仅可以在同一个网络中设备间进行传输,也可以跨网络传输。跨网就需要一个设备在两个网络中,这个设备就是路由器,通过路由表计算下一个要去的IP地址。
那么,路由器是怎么知道IP地址是哪个设备呢?
这就需要一层来标识网络中的设备即数据链路层,主要为网络层提供链路级别传输服务。
标识唯一设备是通过设备网卡的MAC地址,路由器计算出下一个目的地的IP地址,通过ARP协议找到目的地的MAC地址,就知道这个IP地址是哪个设备的了。
MAC地址和IP地址的区别?
1.地址长度不同,IP32位,MAC48位;2.MAC在数据链路层,可以使数据从一个节点传递到相同链路的另一个节点上,而IP地址在网络层,网络层协议使数据可以从一个网络传递到另一个网络上(ARP根据目的IP地址,找到中间节点的MAC地址,通过中间节点传送,从而最终到达目的网络);3.MAC是基于制造商硬件,而IP是基于网络拓扑
既然主机之间的连接最终通过MAC地址连接的为什么还要IP地址呢?
答:(1)ARP用来寻找同一个局域网中的主机,同一个局域网的ip地址的网络号相同。每个主机的ip地址并不固定,mac地址固定,最终归结于根据目标主机的mac地址寻找。
(2)不同局域网的主机通信时,通过IP地址的网络号可以减少查找的次数,快速找到目标主机。
物理层:把数据包转换成电信号让其在物理介质中传输,提供二进制传输的服务。
二:HTTP篇
超文本传输协议,双向传输,超文本就是文字,图片和视频的混合,有超链接。如最常见的HTML。
1.HTTP常见字段有哪些呢?
答:1.有Host字段,可以把请求发往同一台服务器的不同网站;2.content-Length字段,服务器返回数据时会返回数据长度。后面的字节就是下一个回应。3.connection字段,用于保持长连接的,里面时connection:keep-live。1.1之后默认都是长连接;4.content-type字段,是服务器告诉客户端数据啥格式;5.content-Encoding字段,告诉数据的压缩方法。
2.get和post的区别
答:1.get是从服务器获取资源,而post是向URI指定的资源提交数据,数据是在请求体body中的,类似于留言,拼接好请求头后,可以通过TCP发送给服务器;2.get是安全且幂等的,post是不安全不幂等的,所谓安全是不会破坏服务器的资源,幂等就是执行相同的操作,返回结果相同。
3.HTTP的特性,优点有哪些?
答:主要是简单灵活和易于扩展,跨平台。简单是因为就是header+body,头信息也是KV形式;灵活就是各类请求方法,URL,状态码啥的都可以自定义,它在最上层,所以下面可以随便变化。跨平台就是电脑到手机。
缺点就是无状态和明文传输,不安全。(1)无状态好在可以减轻服务器负担,不需要记忆状态和信息,但是购物都需要重新验证很麻烦,不过可以通过cookie解决,相当于客户端第一次请求后,服务器会下发一个装有客户信息的纸条;(2)明文就是信息裸奔;(3)不安全就是不加密,不验证身份,报文不知道玩不完整,这些可以使用HTTPS方式解决,就是引入SSL/TSL层。
基于TCP/IP,并且使用了请求-应答模式通信。1.长连接,减少了TCP的重复建立和断开的开销,减轻负载,只要一方没有明确提出断开就一直保持;2.使用长连接可以让管道网络成为可能,就是我可以发多个请求,不需要等另一个回来再发。但是服务器还是顺序处理的,要是慢的会造成队头阻塞;3.队头阻塞靠后面优化。
4.HTTP和HTTPS的区别?
答:HTTPS可以解决HTTP不安全的缺陷,因为在TCP和HTTP层之间加入了SSL/TLS安全协议,可以加密传输。但是连接变复杂了,需要在经过SSL的握手。HHTP端口号80,而HTTPS是443.最后HTTPS需要CA数字证书用来保证服务器的可信。
那HTTPS是如何解决的呢?
(1)通过混合加密保证不被窃听,就是对称和非对称加密结合,通信前是非对称的,有公钥和私钥,后面都是对称加密;(2)摘要算法来保证完整性,生成一个数据的指纹。就是发送端算出明文的指纹,和数据一起加密发,服务端解密后比较指纹是否相同判断数据完整。(3)数字证书,用来存放服务器的公钥和CA数字签名,防止被篡改。
SSL是要经历四次通信的,主要是客户端向服务器索要并验证服务器的公钥;双方协商生成会话密钥;最后通过会话密钥进行加密通信。通过RSA算法。客户端和服务端首次TSL握手连接后,双方会在内存缓存密钥,应用唯一的session ID来标识,session ID和会话密钥相当于KV关系。
当再次连接,消息里会带上session ID,服务器收到后会在内存找,如果找到就直接用该会话密钥恢复会话状态,跳过其余过程,只用一个消息往返就建立安全通信。密钥会定期实现为了安全。
但是session ID会导致客户端增多,服务器内存压力变大,而且由于负载均衡会导致客户端再次连接不一定会命中上次访问的服务器,还是要走TLS握手。于是出现了session Ticket,服务器不再缓存客户端的密钥,而是把缓存工作交给了客户端
5.HTTP的演变?
答:1.1比1.0多了长连接和管道网络传输,但是会造成队头阻塞,每次发送相同首部浪费,并且请求头没有压缩就发送。后面也可以对应重复HTTP请求通过缓存数据到本地来避免发送HTTP请求次数,将URL作为key,响应作为value。
HTTP2是基于HTTPS的,安全,(1)然后头部压缩了(头一样或者相似会帮你消除,用到是HPACK算法而不是常见的gzip压缩方式,客户端和服务器同时维护一张头信息表,只发送索引号);(2)并且使用了二进制,不是纯文本,分为头信息帧和数据帧;(3)多了一个数据编号,客户端是奇数,服务端是偶数,这样可以标记数据包属于哪个回应,还可以指定数据流的优先级(4)多路复用,可以并行处理,发送以及处理好的部分,这样就没有队头阻塞了。通过stream设计,多个stream复用一条TCP连接达到并发效果,HTTP消息是由多个frame构成,一个frame由多个TCP报文构成。不同stream的帧是可以乱序发送的。通过帧的头部携带的stream ID进行组装。
当HTTP2实现100个并发stream时,只需要建立一次TCP连接,而HTTP1.1需要100个。
HTTP3就是解决 HTTP2不知道多少个HTTP请求,如果丢包会重传,这样所有HTTP请求都要等这个包重传。怎么解决?使用UDP而不是TCP了,因为UDP是不管顺序和丢包的。虽然UDP不可靠,但是基于UDP的QUIC协议可以实现可靠传输。
扩展补充:
1.应用层包含:
(1)DNS,域名从上到下分别为根域名,顶级域名,二级域名(权威域名)。使用TCP或UDP进行传输,大多数使用UDP,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输:
- 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)。
- 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)。
(2)FTP,使用TCP连接,分为主动(服务点主动)和被动模式(客户端主动);
(3)DHCP,动态主机配置协议,提供了即插即用的连网方式,用户不再需要手动配置 IP 地址等信息。DHCP 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址。
DHCP 工作过程如下:
- 客户端发送 Discover 报文,该报文的目的地址为 255.255.255.255:67,源地址为 0.0.0.0:68,被放入 UDP 中,该报文被广播到同一个子网的所有主机上。如果客户端和 DHCP 服务器不在同一个子网,就需要使用中继代理。
- DHCP 服务器收到 Discover 报文之后,发送 Offer 报文给客户端,该报文包含了客户端所需要的信息。因为客户端可能收到多个 DHCP 服务器提供的信息,因此客户端需要进行选择。
- 如果客户端选择了某个 DHCP 服务器提供的信息,那么就发送 Request 报文给该 DHCP 服务器。
- DHCP 服务器发送 Ack 报文,表示客户端此时可以使用提供给它的信息。
(4)SMTP,电子邮件协议。
2.通信数据转发
(1)代理
代理服务器接受客户端的请求,并且转发给其它服务器。
使用代理的主要目的是:
- 缓存
- 负载均衡
- 网络访问控制
- 访问日志记录
代理服务器分为正向代理和反向代理两种:
- 用户察觉得到正向代理的存在。
- 而反向代理一般位于内部网络中,用户察觉不到。
(2)网关
与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而请求其它非 HTTP 服务器的服务。
(3)隧道
使用 SSL 等加密手段,在客户端和服务器之间建立一条安全的通信线路。
三、HTTPS
HTTP 有以下安全性问题:
- 使用明文进行通信,内容可能会被窃听;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装;
- 无法证明报文的完整性,报文有可能遭篡改。
HTTPS 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信&#