共计 7883 个字符,预计需要花费 20 分钟才能阅读完成。
此篇文章次要分享计算机网络中 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
格局阐明:
- protocol(协定):指定应用的传输协定,最罕用的是 HTTP 协定,它也是目前 WWW 中利用最广的协定。
- ftp 通过 FTP 拜访资源。格局 ftp://
- http 通过 HTTP 拜访该资源。格局 http://
- https 通过平安的 HTTPS 拜访该资源。格局 https://
- hostname(主机名):是指寄存资源的服务器的域名零碎 (DNS) 主机名或 IP 地址。
- :port(端口号):整数,可选,省略时应用计划的默认端口,各种传输协定都有默认的端口号,如 http 的默认端口为 80。如果输出时省略,则应用默认端口号。有时候出于平安或其余思考,能够在服务器上对端口进行重定义,即采纳非标准端口号,此时,URL 中就不能省略端口号这一项。
- path(门路):由零或多个“/”符号隔开的字符串,个别用来示意主机上的一个目录或文件地址。
- ;parameters(参数):这是用于指定非凡参数的可选项。
- ?query(查问):可选,用于给动静网页(如应用 CGI、ISAPI、PHP/JSP/ASP/ASP.NET 等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
- fragment(信息片断):字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可应用 fragment 间接定位到某一名词解释。
1.4、KeepAlive 参数
- KeepAlive 值是个布尔值,有两个值 On 和 Off,简略来说,当值为 On 的时候,用户发动 HTTP 申请后,Apache 不会立即敞开这个连贯,当还有用户发动 HTTP 申请时,还会应用这个连贯,
- 什么时候敞开呢?看 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、通信模型
目前支流的网络通信模型有以下两种:
- 客户 / 服务器构造(Client/Server,缩写为 C /S,胖客户):典型的 C / S 构造网络系统须要相应的客户端能力实现通信。目前大多数 APP 都是这种模式,如 QQ、微博等。
- 浏览器 / 服务器构造(Browser/Server,缩写为 B /S,瘦客户):典型的 B / S 构造网络系统只有通过浏览器即可拜访,不须要在客户端机装置特定的软件。
2.2、通信形式
TCP 通信
- 这种通信形式是实现 C / S 模式应用程序的次要形式。TCP 是牢靠的连贯通信技术,次要应用套接字(Socket)。 Socket 是 TCP/IP 协定中的传输层接口。TCP 通信是应用 TCP/IP 协定、建设在稳固连贯根底上的、以流传输数据的通信形式。
- TCP(Transfer Control Protocol)协定是一种面向连贯的、提供牢靠传输的协定。它能够确保接管方完全正确地接管到发送方所发送的全副数据。发送方和接管方之间的两个端口必须建设连贯,以便在 TCP 协定的根底上进行通信。在程序中,端口之间建设连贯个别应用 Socket(套接字)办法。
- 当服务器的 Socket 期待服务器申请(即期待建设连贯)时,客户机的 Socket 能够要求进行连贯,一旦这两个 Socket 连贯胜利,它们就能够进行双向数据传输。TCP 协定为实现牢靠的数据传输提供了一个点对点的通道。
HTTP 协定通信
这种通信形式实现 B / S 模式应用程序的次要形式。HTTP 协定简称超文本传输协定,它是应用层协定,次要解决如何包装数据,它建设在 TCP/IP 协定之上的一种利用,它是一种通用的、无状态的、面向对象的协定。HTTP 协定的作用原理包含四个步骤:
- 连贯:Web 浏览器与 Web 服务器建设连贯。
- 申请:Web 浏览器通过 socket 向 Web 服务器提交申请。HTTP 的申请个别是 GET 或 POST 命令(POST 用于 FORM 参数的传递)。
- 应答:Web 浏览器提交申请后,通过 HTTP 协定传送给 Web 服务器。Web 服务器接到后,进行事务处理,处理结果又通过 HTTP 传回给 Web 浏览器,从而在 Web 浏览器上显示出所申请的页面。
- 敞开连贯:当应答完结后,Web 浏览器与 Web 服务器必须断开,以保障其它 Web 浏览器可能与 Web 服务器建设连贯。
3. HTTPS 加密
3.1、加密过程
- 客户端申请服务器获取 证书公钥
- 客户端 (SSL/TLS) 解析证书(有效会弹出正告)
- 生成随机值
- 用 公钥 加密 随机值生成密钥
- 客户端将 秘钥 发送给服务器
- 服务端用 私钥 解密 秘钥 失去随机值
- 将信息和随机值混合在一起 进行对称 加密
- 将 加密 的内容发送给客户端
3.2、中间人攻打
中间人确实无奈失去浏览器生成的密钥 B,这个密钥自身被公钥 A 加密了,只有服务器才有私钥 A’解开拿到它呀!然而中间人却齐全不须要拿到密钥 A’就能干坏事了。请看:
- 某网站领有用于非对称加密的公钥 A、私钥 A’。
- 浏览器向网站服务器申请,服务器把公钥 A 明文给传输浏览器。
- 中间人劫持到公钥 A,保留下来,把数据包中的公钥 A 替换成本人伪造的公钥 B(它当然也领有公钥 B 对应的私钥 B’)。
- 浏览器随机生成一个用于对称加密的密钥 X,用 公钥 B (浏览器不晓得公钥被替换了)加密后传给服务器。
- 中间人劫持后用私钥 B’解密失去密钥 X,再用公钥 A 加密后传给服务器。
- 服务器拿到后用私钥 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 上生成。
- SSL 证书,用于加密 HTTP 协定,也就是 HTTPS。
- 代码签名证书,用于签名二进制文件,比方 Windows 内核驱动,Firefox 插件,Java 代码签名等等。
- 客户端证书,用于加密邮件。
- 双因素证书,网银专业版应用的 USB Key 外面用的就是这种类型的证书。
网站在应用 HTTPS 前,须要向“CA 机构 ”申请颁发一份 数字证书 , 数字证书里有证书持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证一样,能够证实“该公钥对应该网站”。然而这里又有一个不言而喻的问题了,证书自身的传输过程中,如何避免被篡改?即如何证实证书自身的真实性?身份证有一些防伪技术,数字证书怎么防伪呢?
3.4、数字签名
咱们把证书内容生成一份“签名”,比对证书内容和签名是否统一就能觉察是否被篡改。这种技术就叫数字签名。
数字签名制作过程:
- CA 领有非对称加密的私钥和公钥。
- CA 对证书明文信息进行 hash。
- 对 hash 后的值用私钥加密,失去数字签名。
明文和数字签名独特组成了数字证书,这样一份数字证书就能够颁发给网站了。那浏览器拿到服务器传来的数字证书后,如何验证它是不是真的?(有没有被篡改、掉包)
浏览器验证过程:
- 拿到证书,失去明文 T,数字签名 S。
- 用 CA 机构的公钥对 S 解密(因为是浏览器信赖的机构,所以浏览器保有它的公钥。详情见下文),失去 S’。
- 用证书里阐明的 hash 算法对明文 T 进行 hash 失去 T’。
- 比拟 S’是否等于 T’,等于则表明证书可信。
4. Session、Cookie & Token
4.1、cookie
- HTTP 协定自身是无状态的。什么是无状态呢,即服务器无奈判断用户身份。
- cookie 是由 Web 服务器保留在用户浏览器上的小文件(key-value 格局),蕴含用户相干的信息。客户端向服务器发动申请,如果服务器须要记录该用户状态,就应用 response 向客户端浏览器颁发一个 Cookie。客户端浏览器会把 Cookie 保存起来。当浏览器再申请该网站时,浏览器把申请的网址连同该 Cookie 一起提交给服务器。服务器查看该 Cookie,以此来识别用户身份。
4.2、session
- session 是依赖 Cookie 实现的。session 是服务器端对象session 是浏览器和服务器会话过程中,服务器调配的一块贮存空间。服务器默认为浏览器在 cookie 中设置 sessionid,浏览器在向服务器申请过程中传输 cookie 蕴含 sessionid,服务器依据 sessionid 获取出会话中存储的信息,而后确定会话的身份信息。
- 典型的场景是购物车,当你要增加商品到购物车的时候,零碎不晓得是哪个用户操作的,因为 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 套接字
- Socket 的英文原义是“孔”或“插座”。作为 BSD UNIX 的过程通信机制,取后一种意思。通常也称作”套接字”,用于形容 IP 地址和端口,是一个通信链的句柄,能够用来实现不同虚拟机或不同计算机之间的通信。
- 将传输层及以下的网络协议封装,提供简略应用的接口 (API) 给应用层的软件,专门面向 C / S 架构模型设计的
- 三元组:IP 地址、协定、端口号
网络层的“ip 地址 ”能够惟一标识网络中的主机,而传输层的“ 协定 + 端口 ”能够惟一标识主机中的应用程序(过程)。这样 利用三元组(ip 地址,协定,端口)就能够标识网络的过程 了,网络中的过程通信就能够利用这个标记与其它过程进行交互。
5.2、套接字的连贯过程
- 服务器监听 : 不指定具体的客户端套接字 ,处于期待连贯的状态, 实时监控网络状态
- 客户端申请 :指由客户端的套接字提出申请, 指标是服务器端的套接字 ,须要 指出服务器端套接字的地址和端口号
- 连贯确认 :当服务器端套接字监听到客户端套接字的连贯申请,就 响应申请建设一个新的过程 , 并返回客户端服务器的套接字形容,当客户端确认形容,连贯就正式建设,服务器端持续处于监听状态
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()
- 创立一个与该套接字相干的文件
末
【面试系列】文章会继续更新,欢送关注公众号“任冬学编程”,据说点赞都能脱单哦!