关于后端:面试系列计算机网络二

此篇文章次要分享计算机网络中HTTP协定、HTTPS加密、socket网络编程等,文章如有不足之处,欢送交换指出,【面试系列】会继续更新,敬请关注公众号“任冬学编程”!

1. HTTP协定

1.1、HTTP报文构造

HTTP申请报文

一个HTTP申请报文由申请行(request line)、申请头部(header)、空行和申请数据4个局部组成

HTTP响应报文

HTTP响应也由三个局部组成,别离是:状态行、消息报头、响应注释

1.2、常见header

  • Host, 申请头
  • Accept-Encoding,申请头,可承受的文本压缩算法,如: gzip, deflate
  • Accept-Language,申请头,反对语言,客户端浏览器的设置,如:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
  • User-Agent,申请头,浏览器信息,如:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:12.0) Gecko/20100101
  • Cookie,申请头,服务器或客户端在上次设置的COOKIE,包含作用域名(.360buy.com),过期工夫,键与值。
  • Content-Type, 响应的数据类型:text/html;charset=gbk
  • Content-Length,响应的数据体大小
  • Content-Encoding, 如果为文本、HTML信息,则应用的编码方式

1.3、URL内容

URL(Uniform Resource Locator,对立资源定位符),URL由三局部组成:资源类型、寄存资源的主机域名、资源文件名,URL的个别语法格局为:(带方括号[]的为可选项):

protocol://hostname[:port]/path/[;parameters][?query]#fragment

格局阐明:

  1. protocol(协定):指定应用的传输协定, 最罕用的是HTTP协定,它也是目前WWW中利用最广的协定。
  • ftp 通过 FTP拜访资源。格局 ftp://
  • http 通过 HTTP 拜访该资源。 格局 http://
  • https 通过平安的 HTTPS 拜访该资源。 格局 https://
  1. hostname(主机名):是指寄存资源的服务器的域名零碎 (DNS) 主机名或 IP 地址。
  2. :port(端口号):整数,可选,省略时应用计划的默认端口,各种传输协定都有默认的端口号,如http的默认端口为80。如果输出时省略,则应用默认端口号。有时候出于平安或其余思考,能够在服务器上对端口进行重定义,即采纳非标准端口号,此时,URL中就不能省略端口号这一项。
  3. path(门路):由零或多个“/”符号隔开的字符串,个别用来示意主机上的一个目录或文件地址。
  4. ;parameters(参数):这是用于指定非凡参数的可选项。
  5. ?query(查问):可选,用于给动静网页(如应用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
  6. fragment(信息片断):字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可应用fragment间接定位到某一名词解释。

1.4、KeepAlive参数

  1. KeepAlive值是个布尔值,有两个值On和Off,简略来说,当值为On的时候,用户发动HTTP申请后,Apache不会立即敞开这个连贯,当还有用户发动HTTP申请时,还会应用这个连贯,
  2. 什么时候敞开呢?看KeepAliveTimeout这个值,当工夫达到KeepAliveTimeout这个值的时候才会敞开连贯。当值为Off的时候,用户发动HTTP申请后,Apache会立即敞开这个连贯,毛病就是每次拜访都要执行一次TCP握手,减少了CPU的开销。

1.5、状态码

  • 状态码200示意服务器响应胜利,服务器找到了客户端申请的内容,并将内容发送给了客户端。
  • 状态码302示意长期跳转。
  • 状态码301代表的是永久性的重定向。
  • 304状态码,被申请的资源内容没有产生更改。
  • 401 (未受权) 申请要求身份验证。 对于须要登录的网页,服务器可能返回此响应。
  • 403 (禁止) 服务器拒绝请求。
  • 404 (未找到) 服务器找不到申请的网页。
  • 500 (服务器外部谬误) 服务器遇到谬误,无奈实现申请。
  • 501 (尚未施行) 服务器不具备实现申请的性能。 例如,服务器无奈辨认申请办法时可能会返回此代码。
  • 502 (谬误网关) 服务器作为网关或代理,从上游服务器收到有效响应。
  • 503 (服务不可用) 服务器目前无奈应用(因为超载或停机保护)。 通常,这只是临时状态。
  • 504 (网关超时) 服务器作为网关或代理,然而没有及时从上游服务器收到申请。
  • 505 (HTTP 版本不受反对) 服务器不反对申请中所用的 HTTP 协定版本。

1.6、<font color=”red”>HTTP1.0/1.1/2.0 的区别</font>

HTTP1.0最早在网页中应用是在1996年,那个时候只是应用一些较为简单的网页上和网络申请上,而HTTP1.1则在1999年才开始广泛应用于当初的各大浏览器网络申请中,同时HTTP1.1也是以后应用最为宽泛的HTTP协定

HTTP 1.0

HTTP 1.0 是在 1996 年引入的,从那时开始,它的普及率就达到了惊人的成果。

  • HTTP 1.0 仅仅提供了最根本的认证,这时候用户名和明码还未经加密,因而很容易收到窥探。
  • HTTP 1.0 被设计用来应用短链接,即每次发送数据都会通过 TCP 的三次握手和四次挥手,效率比拟低。
  • HTTP 1.0 只应用 header 中的 If-Modified-Since 和 Expires 作为缓存生效的规范。
  • HTTP 1.0 不反对断点续传,也就是说,每次都会传送全副的页面和数据。
  • HTTP 1.0 认为每台计算机只能绑定一个 IP,所以申请音讯中的 URL 并没有传递主机名(hostname)。

HTTP 1.1

HTTP 1.1 是 HTTP 1.0 开发三年后呈现的,也就是 1999 年,它做出了以下方面的变动

  • HTTP 1.1 应用了摘要算法来进行身份验证
  • HTTP 1.1 默认应用长连贯,长连贯就是只需一次建设就能够传输屡次数据,传输实现后,只须要一次切断连贯即可。长连贯的连贯时长能够通过申请头中的 keep-alive 来设置
  • HTTP 1.1 中新减少了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存管制标头来管制缓存生效。
  • HTTP 1.1 反对断点续传,通过应用申请头中的 Range 来实现。
  • HTTP 1.1 应用了虚构网络,在一台物理服务器上能够存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。

HTTP 2.0

HTTP 2.0 是 2015 年开发进去的规范,它次要做的扭转如下

  • 头部压缩,因为 HTTP 1.1 常常会呈现 User-Agent、Cookie、Accept、Server、Range 等字段可能会占用几百甚至几千字节,而 Body 却常常只有几十字节,所以导致头部并重。HTTP 2.0 应用 HPACK 算法进行压缩。
  • 二进制格局,HTTP 2.0 应用了更加凑近 TCP/IP 的二进制格局,而摈弃了 ASCII 码,晋升了解析效率
  • 强化平安,因为平安曾经成为重中之重,所以 HTTP2.0 个别都跑在 HTTPS 上。
  • 多路复用,即每一个申请都是是用作连贯共享。一个申请对应一个id,这样一个连贯上能够有多个申请。

2. 客户端与服务器通信

2.1、通信模型

目前支流的网络通信模型有以下两种:

  1. 客户/服务器构造(Client/Server,缩写为C/S,胖客户):典型的C/S构造网络系统须要相应的客户端能力实现通信。目前大多数APP都是这种模式,如QQ、微博等。
  2. 浏览器/服务器构造(Browser/Server,缩写为B/S,瘦客户):典型的B/S构造网络系统只有通过浏览器即可拜访,不须要在客户端机装置特定的软件。

2.2、通信形式

TCP通信

  1. 这种通信形式是实现C/S模式应用程序的次要形式。TCP是牢靠的连贯通信技术,次要应用套接字(Socket)。 Socket是TCP/IP协定中的传输层接口。TCP通信是应用TCP/IP协定、建设在稳固连贯根底上的、以流传输数据的通信形式。
  2. TCP(Transfer Control Protocol)协定是一种面向连贯的、提供牢靠传输的协定。它能够确保接管方完全正确地接管到发送方所发送的全副数据。发送方和接管方之间的两个端口必须建设连贯,以便在TCP协定的根底上进行通信。在程序中,端口之间建设连贯个别应用Socket(套接字)办法。
  3. 当服务器的Socket期待服务器申请(即期待建设连贯)时,客户机的Socket能够要求进行连贯,一旦这两个Socket连贯胜利,它们就能够进行双向数据传输。TCP协定为实现牢靠的数据传输提供了一个点对点的通道。

HTTP协定通信

​ 这种通信形式实现B/S模式应用程序的次要形式。HTTP协定简称超文本传输协定,它是应用层协定,次要解决如何包装数据,它建设在TCP/IP协定之上的一种利用,它是一种通用的、无状态的、面向对象的协定。 HTTP协定的作用原理包含四个步骤:

  1. 连贯:Web浏览器与Web服务器建设连贯。
  2. 申请:Web浏览器通过socket向Web服务器提交申请。HTTP的申请个别是GET或POST命令(POST用于FORM参数的传递)。
  3. 应答:Web浏览器提交申请后,通过HTTP协定传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所申请的页面。
  4. 敞开连贯:当应答完结后,Web浏览器与Web服务器必须断开,以保障其它Web浏览器可能与Web服务器建设连贯。

3. HTTPS加密

3.1、加密过程

  1. 客户端申请服务器获取 证书公钥
  2. 客户端(SSL/TLS)解析证书(有效会弹出正告)
  3. 生成随机值
  4. 用 公钥加密 随机值生成密钥
  5. 客户端将 秘钥 发送给服务器
  6. 服务端用 私钥 解密 秘钥 失去随机值
  7. 将信息和随机值混合在一起 进行对称加密
  8. 加密的内容发送给客户端

3.2、中间人攻打

中间人确实无奈失去浏览器生成的密钥B,这个密钥自身被公钥A加密了,只有服务器才有私钥A’解开拿到它呀!然而中间人却齐全不须要拿到密钥A’就能干坏事了。请看:

  1. 某网站领有用于非对称加密的公钥A、私钥A’。
  2. 浏览器向网站服务器申请,服务器把公钥A明文给传输浏览器。
  3. 中间人劫持到公钥A,保留下来,把数据包中的公钥A替换成本人伪造的公钥B(它当然也领有公钥B对应的私钥B’)
  4. 浏览器随机生成一个用于对称加密的密钥X,用公钥B(浏览器不晓得公钥被替换了)加密后传给服务器。
  5. 中间人劫持后用私钥B’解密失去密钥X,再用公钥A加密后传给服务器
  6. 服务器拿到后用私钥A’解密失去密钥X。

这样在单方都不会发现异常的状况下,中间人失去了密钥B。根本原因是浏览器无奈确认本人收到的公钥是不是网站本人的

3.3、CA证书

CA证书是由CA(Certification Authority)认证机构公布的数字证书。其内容蕴含:电子签证机关的信息、公钥用户信息、公钥、签名和有效期。这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,而后采纳CA的私钥对信息摘要进行加密,加密完的密文就是签名。 即:证书 = 公钥 + 签名 +申请者和颁发者的信息。 客户端中因为在操作系统中就预置了CA的公钥,所以反对解密签名(因为签名应用CA的私钥加密的)

SSL证书CA证书的一种,CA是负责签发证书、认证证书、治理已颁发证书的机关。 它制订政策和具体步骤来验证、辨认用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。 SSL证书(http://ssl.idcspy.net/)就是CA机构签发的。 个别的CA证书,能够间接在WINDOWS上生成。

  1. SSL证书,用于加密HTTP协定,也就是HTTPS。
  2. 代码签名证书,用于签名二进制文件,比方Windows内核驱动,Firefox插件,Java代码签名等等。
  3. 客户端证书,用于加密邮件。
  4. 双因素证书,网银专业版应用的USB Key外面用的就是这种类型的证书。

网站在应用HTTPS前,须要向“CA机构”申请颁发一份数字证书数字证书里有证书持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证一样,能够证实“该公钥对应该网站”。然而这里又有一个不言而喻的问题了,证书自身的传输过程中,如何避免被篡改?即如何证实证书自身的真实性?身份证有一些防伪技术,数字证书怎么防伪呢?

3.4、数字签名

咱们把证书内容生成一份“签名”,比对证书内容和签名是否统一就能觉察是否被篡改。这种技术就叫数字签名。

数字签名制作过程:

  1. CA领有非对称加密的私钥和公钥。
  2. CA对证书明文信息进行hash。
  3. 对hash后的值用私钥加密,失去数字签名。

明文和数字签名独特组成了数字证书,这样一份数字证书就能够颁发给网站了。那浏览器拿到服务器传来的数字证书后,如何验证它是不是真的?(有没有被篡改、掉包)

浏览器验证过程:

  1. 拿到证书,失去明文T,数字签名S。
  2. 用CA机构的公钥对S解密(因为是浏览器信赖的机构,所以浏览器保有它的公钥。详情见下文),失去S’。
  3. 用证书里阐明的hash算法对明文T进行hash失去T’。
  4. 比拟S’是否等于T’,等于则表明证书可信。

4. Session、Cookie & Token

4.1、cookie

  1. HTTP协定自身是无状态的。什么是无状态呢,即服务器无奈判断用户身份。
  2. cookie是由Web服务器保留在用户浏览器上的小文件(key-value格局),蕴含用户相干的信息。客户端向服务器发动申请,如果服务器须要记录该用户状态,就应用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再申请该网站时,浏览器把申请的网址连同该Cookie一起提交给服务器。服务器查看该Cookie,以此来识别用户身份。

4.2、session

  1. session是依赖Cookie实现的。session是服务器端对象session 是浏览器和服务器会话过程中,服务器调配的一块贮存空间。服务器默认为浏览器在cookie中设置 sessionid,浏览器在向服务器申请过程中传输 cookie 蕴含 sessionid ,服务器依据 sessionid 获取出会话中存储的信息,而后确定会话的身份信息。
  2. 典型的场景是购物车,当你要增加商品到购物车的时候,零碎不晓得是哪个用户操作的,因为 HTTP 协定是无状态的。服务端给特定的用户创立特定的 Session 之后就能够标识这个用户并且跟踪这个用户了。

cookie与session区别

  • 存储地位与安全性:cookie数据寄存在客户端上,安全性较差,session数据放在服务器上,安全性绝对更高;
  • 存储空间:单个cookie保留的数据不能超过4K,很多浏览器都限度一个站点最多保留20个cookie,session无此限度
  • 占用服务器资源:session肯定工夫内保留在服务器上,当拜访增多,占用服务器性能,思考到服务器性能方面,该当应用cookie。

4.3、Token

Token的引入:Token是在客户端频繁向服务端申请数据,服务端频繁的去数据库查问用户名和明码并进行比照,判断用户名和明码正确与否,并作出相应提醒,在这样的背景下,Token便应运而生。

Token的定义:Token是服务端生成的一串字符串,以作客户端进行申请的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,当前客户端只需带上这个Token前来申请数据即可,无需再次带上用户名和明码。

应用Token的目标:Token的目标是为了加重服务器的压力,缩小频繁的查询数据库,使服务器更加强壮

Token 是在服务端产生的。如果前端应用用户名/明码向服务端申请认证,服务端认证胜利,那么在服务端会返回 Token 给前端。前端能够在每次申请的时候带上 Token 证实本人的非法位置

session与token区别

  • session机制存在服务器压力增大,CSRF跨站伪造申请攻打,扩展性不强等问题;
  • session存储在服务器端,token存储在客户端
  • token提供认证和受权性能,作为身份认证,token安全性比session好;
  • session这种会话存储形式形式只实用于客户端代码和服务端代码运行在同一台服务器上,token实用于我的项目级的前后端拆散(前后端代码运行在不同的服务器下)

5. socket网络编程

5.1、socket套接字

  1. Socket的英文原义是“孔”或“插座”。作为BSD UNIX的过程通信机制,取后一种意思。通常也称作”套接字”,用于形容IP地址和端口,是一个通信链的句柄,能够用来实现不同虚拟机或不同计算机之间的通信。
  2. 将传输层及以下的网络协议封装,提供简略应用的接口(API)给应用层的软件,专门面向C/S架构模型设计的
  3. 三元组:IP地址、协定、端口号

网络层的“ip地址”能够惟一标识网络中的主机,而传输层的“协定+端口”能够惟一标识主机中的应用程序(过程)。这样利用三元组(ip地址,协定,端口)就能够标识网络的过程了,网络中的过程通信就能够利用这个标记与其它过程进行交互。

5.2、套接字的连贯过程

  1. 服务器监听不指定具体的客户端套接字,处于期待连贯的状态,实时监控网络状态
  2. 客户端申请:指由客户端的套接字提出申请,指标是服务器端的套接字,须要指出服务器端套接字的地址和端口号
  3. 连贯确认:当服务器端套接字监听到客户端套接字的连贯申请,就响应申请建设一个新的过程并返回客户端服务器的套接字形容,当客户端确认形容,连贯就正式建设,服务器端持续处于监听状态

5.3、套接字(socket)函数

服务端

  • s.bind()

    • 绑定(主机,端口号)到套接字
  • s.listen()

    • 开始TCP监听
    • 必须制订最大连接数(操作系统同时可能链接的最大数目)
  • s.accept()

    • 被动承受TCP客户的连贯,(阻塞式)期待连贯到来(阻塞:无响应直到承受到连贯申请)

客户端

  • s.connect()

    • 被动初始化TCP服务器连贯
  • s.connec_ex()

    • connect()函数的扩大版本,出错时返回出错码,不抛出异样

公共用处

  • s.recv()

    • 接管TCP数据
    • 不可接管’空’
  • s.send()

    • 发送TCP数据
    • 待发送数量大于己端缓存残余区空间时,数据失落,不会发完
  • s.sendall()

    • 发送残缺的TCP数据,循环调用s.send
    • 通常给数据加上报头将数据打包更安全可靠,不罕用sendall
  • s.recvfrom()

    • 接管UDP数据
  • s.sendto()

    • 发送UDP数据
  • s.getpeername()

    • 连贯到以后套接字的远端的地址
  • s.getsockname()

    • 以后套接字的地址
  • s.getsockopt()

    • 返回指定套接字的参数
  • s.setsockopt()

    • 设置指定套接字的参数
  • s.close()

    • 敞开套接字

面向锁的套接字办法

  • s.setblocking()

    • 设置套接字的阻塞与非阻塞模式
  • s.settimeout()

    • 设置阻塞套接字操作的超时工夫
  • s.gettimeout()

    • 失去阻塞套接字操作的超时工夫

面向文件的套接字的函数

  • s.fileno()

    • 套接字的文件描述符
  • s.makefile()

    • 创立一个与该套接字相干的文件

【面试系列】文章会继续更新,欢送关注公众号“任冬学编程”,据说点赞都能脱单哦!

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

阿里云限时活动-1核2G-1M带宽-40-100G ,特惠价87.12元/年(原价1234.2元/年,可以直接买3年),速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据