计算机网络

一、socket是什么,什么场景会用到

手撕Linux Socket——Socket原理与实践分析 - 知乎

1.Socket是Linux跨进程通信方式的一种。根据通信域的不同可以划分成2种:

1)同一台主机内跨进程通信,Unix domain socket(又叫 IPC(inter-process communication 进程间通信) socket);

2)不同主机间的跨进程通信,Internet domain socket 

2.Internet domain socket根据通信协议划分成3种:流式套接字(SOCK_STREAM)(如TCP),数据报套接字(SOCK_DGRAM)(如UDP)及原始套接字。

3.一个完整的Socket的组成应该是由[协议,本地地址,本地端口,远程地址,远程端口]组成的一个5维数组。

Socket适用场景:

1. Internet domain socket:

1)客户端与服务端通信;

2)浏览器进程与web服务器进程通信;

3)QQ进程与好友的QQ进程通信;

2. Unix domain socket:同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1)

1)X Window 服务器和 GUI 程序之间就是通过 UNIX domain socket 通讯的;

2)docker使用的是client-server架构,用户通过docker client输入命令,client将命令转达给docker daemon去执行。docker daemon会监听一个unix domain socket(一个docker.sock文件)来与其他进程通信,默认路径为/var/run/docker.sock

二、除了socket其他通信方式​​​​​​​

HTTP、Socket两者之间的关联(上) - 知乎

每一个应用层(TCP/IP参考模型的最高层)协议一般都会使用到两个传输层协议 TCP 和 UDP之一:

1.运行在 TCP协议上的协议:

1)HTTP(HypertextTransferProtocol,超文本传输协议),主要用于普通浏览。
2)HTTPS(HTTP over SSL,安全超文本传输协议), HTTP协议的安全版本。
3)FTP(FileTransferProtocol,文件传输协议),用于文件传输。
4)POP3(PostOfficeProtocol,version3,邮局协议),收邮件用。
5)SMTP(SimpleMailTransferProtocol,简单邮件传输协议),用来发送电子邮件。
6)TELNET(Teletypeover theNetwork,网络电传),通过一个 终端(terminal)登陆到网络。
7)SSH(SecureShell,用于替代安全性差的TELNET),用于加密安全登陆用。


2.运行在 UDP协议上的协议:

1)BOOTP(BootProtocol,启动协议),应用于无盘设备。
2)NTP(NetworkTimeProtocol,网络时间协议),用于网络同步。
3)DHCP(DynamicHostConfigurationProtocol,动态主机配置协议),动态配置IP地址。


3.运行在 TCP和 UDP协议上:

DNS(DomainNameService,域名服务),用于完成地址查找,邮件转发等工作。

三、HTTP1.0 和 HTTP1.1 之间区别

1.长连接 :

1)在 HTTP/1.0 中,默认使用短连接,每次请求要重新建立一次连接。HTTP 是基于 TCP的,每一次建立或者断开连接,需要三次握手四次挥手的开销,开销较大;

2)HTTP 1.1 ,默认使用长连接 Connection: keep-alive,长连接可以发多个请求。。 HTTP/1.1 的持续连接,有非流水线方式流水线方式 :

1>流水线方式:客户在收到 HTTP 的响应报文之前,就能接着发送新的请求报文;

2>非流水线方式:客户在收到前一个响应后才能发起下一个请求;

2.错误响应码:在 HTTP 1.1 中,新增了 24 个错误状态响应码,如

3.409(Conflict):表示请求的资源与资源的当前状态发生冲突;

410(Gone):表示服务器上的某个资源被永久性的删除;

3.缓存处理

1)HTTP 1.0 中,主要使用 header 头里的 If-Modified-SinceExpires 来做为缓存判断的标准;

2)HTTP 1.1,则引入了更多的缓存控制策略,如 Entity tagIf-Unmodified-SinceIf-MatchIf-None-Match 等;

4.带宽优化及网络连接的使用

1)HTTP 1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象传送了过来,并且不支持断点续传功能

2)HTTP 1.1 中,则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样方便开发者自由的选择,以便于充分利用带宽和连接。

四、TLS和SSL区别

互联网上使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,为解决这些问题。

SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。

传输层安全 (TLS Transport Layer Security) 是 SSL 的继承协议,SSL与TLS为同一种东西为不同阶段的叫法。

SSL 直接在传输控制协议 (TCP) 基础上高效运行,起重要防护作用。

五、SSL的具体连接过程

https://segmentfault.com/a/1190000021559557

加图

HTTPS 加密、解密、验证及数据传输过程.png

  1. "client hello"消息:客户端通过发送"client hello"消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个"client random"随机字符串。
  2. "server hello"消息:服务器发送"server hello"消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和"server random"随机字符串。
  3. 验证客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程可以细化为以下几个步骤:

    1. 检查数字签名
    2. 验证证书链
    3. 检查证书的有效期
    4. 检查证书的撤回状态 (撤回代表证书已失效)
  4. "premaster secret"字符串:客户端向服务器发送另一个随机字符串"premaster secret (预主密钥)",这个字符串是经过服务器的公钥加密过的,只有对应的私钥才能解密。
  5. 使用私钥:服务器使用私钥解密"premaster secret"。
  6. 生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY
  7. 客户端就绪:客户端发送经过共享密钥 KEY加密过的"finished"信号。
  8. 服务器就绪:服务器发送经过共享密钥 KEY加密过的"finished"信号。
  9. 达成安全通信:握手完成,双方使用对称加密进行安全通信。

六、证书不合法会怎样

https://segmentfault.com/a/1190000021778053

 tls/ssl证书错误,浏览器会阻止tls握手连接. 提示HTTPS警告

  • 域名不匹配: 网站域名与证书中的不相匹配.解决方案:从新签发一个新证书,或者使用通配符证书.
  • 证书链不正确: 证书链中缺少中间证书.解决方案:安装缺失了的中间证书.缺失的中间证书可以在你购买tls证书的CA机构网站找到.
  • 证书过期或被撤销: 服务端使用了不受信任, 过期, 或被撤销的tls证书.解决方法是重新购买和安装一份合法的证书.
  • 使用自签名证书: 使用自签名证书或内部网络路径混乱;去一个受信任的CA机构重新签署一份tls证书.

七、HTTP和HTTPS区别

https://segmentfault.com/a/1190000021494676

HTTPS 和 HTTP 的区别:

  • 安全性,HTTP 明文传输,不对数据进行加密安全性较差。HTTPS (HTTP + SSL / TLS)的数据传输过程是加密的,安全性较好。
  • 费用, HTTPS 协议需要申请 CA 证书,免费证书较少,需要一定费用。证书颁发机构如:Symantec、Comodo、DigiCert 和 GlobalSign 等。
  • 响应速度,HTTP 页面响应速度比 HTTPS 快,由于加了一层安全层,建立连接的过程更复杂,要交换的数据更多。
  • 资源,由于 HTTPS 是建构在 SSL / TLS 之上的 HTTP 协议,所以,要比 HTTP 更耗费服务器资源。
  • 端口,HTTPS 和 HTTP 使用的是完全不同的连接方式,用的端口也不一样,前者是 443,后者是 80。

HTTPS 的缺点:

  • 耗费资源多,在相同网络环境中,HTTPS 相比 HTTP ,响应时间长,耗电量大,更多服务器资源,成本高。
  • HTTPS 的安全是有范围的,在黑客攻击、服务器劫持等情况下几乎起不到作用;在现有的证书机制下,中间人攻击依然有可能发生。

八、SSL如何绑定多个域名

ssl按照域名性质分为:

  1. 单域名证书
  2. 多域名证书
  3. 通配符证书
  4. 多域名通配符证书 

单域名证书只可以给一个网站使用,通常供应商会提供补齐www和非www。价格从0~数百元。

多域名证书按照需要购买域名个数,通常需要数百元(跟域名量有关),英文叫做UCC或者SAN。

通配符证书理论上可以给无数个业务使用(只要都在同一个主域名下),适合不确定未来会做多少业务的公司申请。

多域名通配符就是N个通配符证书合在一张上,需要数千元~万元。主要适合大型公司、集团,业务线广主域名多的时候申请。

九、put 和 post 区别

PUT来达到更改资源,需要client提交资源全部信息,如果只有部分信息,不应该使用PUT(因为服务器使用client提交的对象整体替换服务器的资源),对于服务器到底是创建还是更新,由服务器返回的HTTP Code来区别,put同样的请求前一条会被后一条覆盖,具有幂等性。

POST在请求的时候,服务器会每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建。因此PUT是幂等的。

假如有一个博客系统提供一个Web API,模式是这样http://superblogging/blogs/post/{blog-name},很简单,将{blog-name}替换为我们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。我们应该用PUT方法还是POST方法?取决于这个REST服务的行为是否是idempotent(幂等)的,假如我们发送两个http://superblogging/blogs/post/Sample请求,服务器端是什么样的行为?如果产生了两个博客帖子,那就说明这个服务不是idempotent的,因为多次使用产生了副作用了嘛;如果后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。

十、UDP,TCP数据包的最大传输长度

TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层. 
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这个1500字节被称为链路层的MTU(最大传输单元)。
这个MTU指的是链路层的数据区。 并不包括链路层的首部和尾部的18个字节。 所以这1500字节就是网络层IP数据报的长度限制。 因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.    

UDP 包大小: 1500 - IP头(20) - UDP头(8) = 1472 (Bytes)

TCP 包大小: 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)

我们在用Socket编程时,UDP协议要求包小于64K。TCP没有限定,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需将SOCKET看作一条数据流的入口,往里面放数据,TCP协议本身会进行拥塞/流量控制。

 

十一、断包和粘包

以太网中存在一个对于帧的有效数据大小的限制,即 MTU,以太网的 MTU 为 1500 字节。

1.断包

就是说发送端一次发送的消息长度过大,如果超过了 MTU,那么 ip 会对其进行分片。

在网络编程中,要避免出现 IP 分片。因为是 IP 层是没有超时重传机制的,如果 IP 层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP 分片会大大降低传输层传送数据的成功率,所以要避免 IP 分片。

对于 UDP 包,我们需要在应用层去限制每个包的大小,一般不要超过 1472 字节,即以太网 MTU(1500)- UDP 首部(8)- IP 首部(20)。

对于 TCP 数据,应用层就不需要考虑这个问题了,因为传输层已经做了。在建立连接的三次握手的过程中,连接双方会相互通告MSS(Maximum Segment Size,最大报文段长度),一般 MSS = MTU - IP 首部(20)- TCP 首部(20),每次发送的 TCP 数据都不会超过双方 MSS 的最小值,所以就保证了 IP 数据报不会超过 MTU,避免了 IP 分片。

而断包就是因为 MSS 的存在,当消息长度过大,例如超过了 1460 字节(因为 tcp 首部一般为 20 个字节,ip 首部为 20 个字节),那么 tcp 就会将其分片,然后每片被 tcp 封装,然后由 ip 封装,最后被传输到接收端,这样子当接收端接收到消息后,就会不清楚这是不是一个完整的消息。

2.粘包

为了提高网络利用率,当传输层发现传输的数据长度太小时,会等待多个消息一起发送,这时候就会提高网络利用率,但是当接收端接收过以后,会不知道这是一个完整的消息,还是多个消息在一起。从而有可能将其作为一个消息来处理。nagle 算法就是实现的这个功能。

对于断包和粘包的通常处理方法为将消息封装为一定的格式,例如每个消息头部为 aa,尾部为 55,或者将整个消息的有效长度标明,这样子当接收端接收到消息之后,就可以以此来分辨消息是不是完整的。

十二、REST优点

Resource Representational State Transfer 表现层状态转移

Resource:资源,即数据(网络的核心)。
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP动词实现。

     之前网页是前端后端融在一起的,比如之前的PHP,JSP等。在之前的桌面时代问题不大,但是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为 Web,iOS和Android提供服务。另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要有显式的前端,只需要一套提供服务的接口,于是RESTful更是它们最好的选择。在RESTful架构下:

1.在 REST 中,一切的内容都被认为是一种资源

2.每个资源都由 URI 唯一标识

3.使用统一的接口处理资源请求(POST/GET/PUT/DELETE/HEAD)

4.无状态(每次请求之前是无关联,没有 session )

十三、多服务器共享Session的解决方案

1、写客户端Cookie的方式

把原来存储在服务器磁盘上的session数据存储到客户端的cookie中去。(一般是把session数据按照自己定义的加密规则(如:采用DES、RSA等进行明文加解密;再由MD5、SHA-1等算法进行防伪认证),加密后后存在cookie中。)

优势
服务器的压力减小了,因为session数据不存在服务器磁盘上,无需额外的服务器资源。根本就不会出现session读取不到的问题。

劣势
网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器。要占用很多带宽了,成本增高(服务器购买带宽是一个很大费用)。
浏览器对cookie的大小个数都存在限制。每个浏览器限制是不同的(大概4kb左右)。
安全问题,虽然通过了加密,等你不能保证不会被人解密
总结:
这方案不适合高访问量的情况下,因为高访问量的情况下,每次请求浏览器都要发送session数据给服务器。一般一个cookie大小2k的样子。

2、sticky模式(粘性会话模式)

用一种算法(简单理解为规则),什么机制下session是保存在哪台服务器下,那么读取的时候就按照这种规则去读取,就能定位到原来的服务器。叫做分发请求,分发到特定的服务器上去,其原理是存session和读session数据保证都在一台服务器操作,就不会需要涉及到共享,具体实现方式是通过约定一种分发机制来实现(如Nginx下的ip_hash、Apache下的stickysession等)。
也叫做sticky模式(粘性会话模式),同一个用户的访问请求都被派送到同一个服务器上。

优势
本地维护Session,不需要做session数据共享了。

劣势
一台服务器宕机后,当前Session断掉。

总结:
本来负载均衡有一个目的就是:当其中一台机子不可用的时候,会自动分发到可用的机子上去(自动判断现在要请求的机子是否可用),但此方法一台服务器出现问题,该服务器下的用户都不能用了

3、利用数据库共享Session数据

首选Mysql数据库,并且建议使用内存表Heap,提高session操作的读写效率。

优势
保存在数据库中,这种方式的扩展性很强,可以随意增加WEB而不受影响。放在数据库里面安全方面好。

劣势
session的并发读写能力取决于Mysql数据库的性能
当访问量大时,每个用户都要频繁的访问session,造成mysql服务器压力过大
由于http是短连接,每次过程是:建立连接(握手)->数据通信->通信结束后结束连接。如果频繁的这样子连接后再断开(每次都会去数据库查询session),性能会非常差。

4、利用NFS共享Session数据

NFS是Net FileSystem的简称,最早由Sun公司为解决Unix网络主机间的目录共享而研发。
通过nfs的方式,各个服务器操作session数据的时候,是读取本地磁盘目录,但实际上是一个共享网络文件。各个服务器实际上操作的都是同一个目录的文件。

优势
这个方案实现最为简单,无需做过多的二次开发,仅需将共享目录服务器mount到各频道服务器的本地session目录即可。

劣势
缺点是NFS依托于复杂的安全机制和文件系统,因此并发效率不高,尤其对于session这类高并发读写的小文件,会由于共享目录服务器的io-wait过高,最终拖累前端WEB应用程序的执行效率。

5、基于内存(Redis、Memcache)的Session共享  

相比较与其他方式,该方式是目前最好的session共享方案

可以将session数据保存在memcached,redis之类内存数据库中,memcached是基于内存存储数据的,性能很高,用户并发量很大的时候尤其合适。
建议使用redis,支持的数据格式比较多、能够查看在线用户、数据不容易丢失,支持持久化等

优势
主要是利用内存的数据读取速度是很快的,与磁盘读取的速度不是一个数量级的。
使用内存存储:方便统计在线人数,内存的速度比磁盘访问快、内存数据库系统能够控制内存中的过期数据自动失效(刚好符合session过期需要)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值