计算机网络基础知识与安全。
计算机网络
OSI参考模型
OSI有七层,从下到上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
物理层设备:中继器和集线、网卡。数据链路层的设备:网桥或交换机。实现同一种数据链路下的包传递。
数据链路层:负责分配Mac地址,一个网卡会有一个全球固定的MAC地址。
网络层:对数据包进行路由选择和存储转发。协议:IP、IPX、ICMP、IGMP、ARP、RARP、OSPF等;数据单位为分组或数据包。设备:路由器。实现跨越不同数据链路的包传递。
传输层:第一个端到端,进程到进程的层次。有复用和分用的功能。协议:TCP、UDP、SCTP等。 传输层数据的单位为报文或数据段。
应用层:为操作系统或者网络应用程序提供网络接口。协议:RIP、TELNET、FIP、HTTP、SNMP。
TCP/IP模型
从高到低:应用层、传输层、网络层,数据链路层。
应用层
决定了向用户提供应用服务时的通信的活动。
比如:文件传输协议(FTP)、电子邮件协议(SMTP)、超文本传输协议(HTTP)、域名解析服务(DNS)–通常基于UDP协议
DNS:提供域名到IP地址之间的解析服务。提供域名查找IP地址。或逆向从IP地址反查域名。
HTTP协议–HTTP1.1
定义:HTTP第一种无状态、由文本构成的请求-响应协议,这种协议使用的是客户端-服务器(C/S)模型。 —纯文本方式
通过浏览器访问网页就直接使用了 HTTP 协议。使用 HTTP 协议时,客户端首先与服务端的 80 端口建立一个 TCP 连接,然后在这个连接的基础上进行请求和应答,以及数据的交换。
HTTP两个常用版本,分别是 1.0 和 1.1。主要区别在于 HTTP 1.0 中每次请求和应答都会使用一个新的 TCP 连接,而从 HTTP 1.1 开始,运行在一个 TCP 连接上发送多个命令和应答。因此大幅度减少了 TCP 连接的建立和断开,提高了效率。
HTTP请求
请求报文是由:报文首部(请求行、请求首部字段、通用首部字段、实体首部字段)、空行和报文主体。构成。
请求行:请求方法、请求URI和HTTP版本。
HTTP 有八种请求(也称方法):
GET、POST、PUT(传输文件)、HEAD、DELETE(删除文件)、OPTIONS、TRACE、CONNECT。
其中最常见的是 GET 请求和 POST 请求。
GET方法:用来请求以备URI识别的资源。通常用于查询、获取数据。
POST方法:用来传输实体的主体。用于发送数据.
注意:
POST 请求仅比 GET 请求略安全一点,它的数据不在 URL 中,但依然以明文的形式存放于 HTTP 的请求头中。
HTTP响应
响应报文是由:报文首部(状态行、响应首部字段、通用首部字段、实体首部字段)、空行和报文主体。构成。
状态行:原因短语和HTTP版本。
状态码:
1XX: 信息性。接收的请求正在处理。100表示客户端应该继续发送请求。101切换协议。
2XX:成功。200表示请求已成功。200 OK。204 NO Content。206 Partial Content。
3XX:重定向。301 Moved Permanently(永久).302 Found(临时)。303 See Other。 304 Not Modified. 307 Temporary Redirect
4XX:客户端错误。400 Bad Request。 401 Unauthorized。403 Forbidden。 404 Not Found
5XX:服务端错误。500 Internal Sever Error。 503 Service Unavailable。
首部字段:
- 通用首部字段:请求报文和响应报文都有
- 请求首部字段
- 响应首部字段
- 实体首部字段
通用首部字段
请求首部字段
响应首部字段
实体首部字段
Cookie 和 Session
HTTP 是一种无状态的连接,客户端每次读取 web 页面时,服务器都会认为这是一次新的会话。但有时候我们又需要持久保持某些信息,比如登录时的用户名、密码,用户上一次连接时的信息等。这些信息就由 Cookie 和 Session 保存。
这两者的根本性区别在于,cookie 保存在客户端上,而 session 则保存在服务器中。由此我们还可以拓展出以下结论:
- cookie 相对来说不安全,浏览器可以分析本地的 cookie 进行 cookie 欺骗。
- session 可以设置超时时间,超过这个时间后就失效,以免长期占用服务端内存。
- 单个 cookie 的大小有限制(4 Kb),每个站点的 cookie 数量一般也有限制(20个)。
- 客户端每次都会把 cookie 发送到服务端,因此服务端可以知道 cookie,但是客户端不知道 session。
当服务器接收到 cookie 后,会根据 cookie 中的 SessionID 来找到这个客户的 session。如果没有,则会生成一个新的 SessionID 发送给客户端。
为Cookie服务的首部字段:
输入URL按下回车后究竟发生了什么?
- 浏览器向DNS服务器查询URL对应的IP地址
- DNS返回IP地址
- 浏览器打开TCP连接(默认端口为80),并向web服务器发送HTTP请求
- 若页面发生跳转,服务器则以一个重定向响应,然后跳转到5,否则到6
- 浏览器跟随重定向,再次发送http请求
- 服务器处理请求,并返回HTML响应
- 浏览器接受请求的页面源码
- 浏览器开始渲染HTML
- 浏览器发送嵌入到HTML中的对象请求
- 浏览器进一步发送异步(Ajax)请求
- 浏览器关闭TCP连接
HTTP协议–HTTP2.0
目的:提升加载Web内容时的感知性能。和HTTP1.1的区别在于HTTP2.0是二进制协议、首部压缩、多路复用、加密传输。
新特性:首部压缩、分帧传输、服务端推送。
Web性能优化的技术:
- DNS查询优化
- 优化TCP连接
- 避免重定向
- 客户端缓存
- 网络边缘缓存
- 条件缓存
- 压缩和代码极简化
- 避免阻塞的CSS/JS
- 图片优化
HTTPS
- 概念
HTTPS 是安全的 HTTP。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
HTTP 协议中的内容都是明文传输,HTTPS 的目的是将这些内容加密,确保信息传输安全。最后一个字母 S 指的是 SSL/TLS 协议,它位于 HTTP 协议与 TCP/IP 协议中间。
HTTPS
- Charles 可以调试 HTTPS 通信,它的原理就是需要用户安装 Charles 的根证书,然后我们的请求会被代理到 Charles 服务器,它下发的 Charles 证书才能被正确解析。另一方面,Charles 会作为客户端,从真正的服务器哪里拿到正确的 https 证书并用于后续通信。幸好 Charles 不是流氓软件,或者它的私钥一旦泄露,对用户都会造成很大的影响。
- TCP 有三次握手,再加上 HTTPS 的四次握手,会不会影响性能?
影响肯定有,但是可以接受
首先,HTTPS 肯定会更慢一点,时间主要花费在两组 SSL 之间的耗时和证书的读取验证上,对称算法的加解密时间几乎可以忽略不计。
http和https的区别;抓包的时候有什么区别;
- HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 - HTTP 是不安全的,而 HTTPS 是安全的
- HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
- 在OSI 网络模型中,HTTP工作于应用层,而HTTPS 工作在传输层
- HTTP 无法加密,而HTTPS 对传输的数据进行加密
- HTTP无需证书,而HTTPS需要CA机构wosign的颁发的SSL证书
- HTTP无安全锁,HTTPS有安全锁
- HTTP不能防钓鱼网站,HTTPS可以预防钓鱼网站
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输,有两种不同性质的协议:TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)。
TCP与UDP两种协的区别:
TCP中文全名:传输控制协议,UDP中文全名:用户数据报协议。
1>TCP传输控制协议,它是面向连接的,数据传输的单位是报文段,能够提供可靠的交付。
2>UDP用户数据包协议,它是无连接的,数据传输的单位是用户数据包,不提用可靠的交付,只能提供“最大努力交付”。
更多参考:http://www.imlifengfeng.com/blog/?p=270
TCP连接的建立和终止
TCP建立连接要进行“三次握手”:交换三个分节。
(客户端):我要建立连接了。
(服务端):我知道你要建立连接了,我这边没有问题。
(客户端):我知道你知道我要建立连接了,接下来我们就正式开始通信。
大致流程:
1>客户端向服务器发送一个SYN J;
2>服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1。
3>客户端再向服务器发一个确认ACK K+1;
为何采用“三次握手”建立连接,采用二次握手可以吗?为什么?
答:不可以。采用三次握手是为了防止失效的连接请求报文段突然又传送到了服务器,从而发生错误。
当客户端发出的连接请求报文段由于某些原因没有及时到达服务器,而客户端再等待一段时间后,又重新发送连接请求,且建立成功,那么第一次发送的那个就是失效的连接报文段。
若是因为网络延迟到达服务器,服务器以为是客户端又发起的新连接,于是服务器同意连接,并向客户端发回确认,但是此时客户端不理会,服务器就一直等待客户端发送数据,导致服务器资源浪费。
TCP终止连接要进行“四次挥手”
(客户端):我要关闭连接了。
(服务端):你那边的连接可以关闭了。
(服务端):我这边也要关闭连接了。
(客户端):你那边的连接可以关闭了。
由于连接是双向的,所以双方都要主动关闭自己这一侧的连接。
大致流程:
1>某个应用进程首先调用close,我们称这一端执行主动关闭,这一端的TCP于是发送一个FIN分节,表示数据发送完毕。
2>另一端接收到FIN分节之后,执行被动关闭,对这个FIN进行确认。它的接受也作为文件结束符传递给接收端应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
3>一段时间后,接收到文件结束符的应用进程调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
4>接收到这个FIN的原发送端TCP(执行主动关闭的那一端)对它进行确认。
进程终止时,所以打开的TCP连接上都会发出一个FIN。
为什么需要四次挥手释放连接?
关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了,但未必你所有数据都全部发送给对方了,所以你未必马上关闭socket,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方表示你没有数据发送给对方了,针对每个FIN报文,都需要一个ACK报文,故需要四次挥手。
只有主动关闭的一方才会进入TIME_WAIT状态。
Socket的基本操作(TCP)
- socket()函数
- bind()函数
- listen()函数
- connect()函数
- accept()函数
- close()函数
- shutdown()函数
描述一个面向连接的客户端socket程序的主要步骤: - 加载套接字库
- 创建套接字(socket())
- 向服务器发送连接请求(connect())
- 和服务器端进行通信
- 关闭套接字(close())
socket连接和HTTP连接的区别:
- HTTP协议是基于TCP连接的,是运用层协议,主要解决如何包装数据
- Socket是对TCP/IP 协议的封装,Socket本身不是协议,而一个调用接口(API),通过Socket我们才能使用TCP/IP协议。
- HTTP连接:短连接,客户端向服务器发送一次请求,服务器响应后链接断开,节省资源。服务器不能主动给客户端响应(除非采用HTTP长连接技术),IPhone主要使用类NSURLConnection。
- Socket长连接:客户端跟服务器端直接使用Socket进行链接,没有规定连接后断开,因此服务端和客户端保持连接通道,双方可以主动发送数据,一般多用于游戏,Socket默认连接超时时间是30s。默认大小8K。一个数据包的大小。
网络层
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小的数据单位。在众多的选项内选择一条传输路线在多台计算机设备进行传输。
IP协议:作用就是把各种数据包传送给对方,而要确保确实传送到了对方,必须满足两个条件:IP地址(可变换)、MAC地址(不会变)。
IPV4地址
连接在Internet中的每台主机(路由器)都分配一个32bit的全球唯一标识符,就是IP地址。
IP地址编码的三种:分类的IP地址、子网的划分、CIDR。
IP地址:分类的地址,分别为A类、B类、C类和D类、E类。都是由网络号和主机号两部分组成。网络号:主机所连接到的网络。主机号:该主机或路由器在网络中的地址。
分类的依据是IP地址的前四位:
A类IP地址是第一位为“0”的地址。A类IP地址的前8位是网络标识,用十进制标识的话0.0.0.0-127.0.0.0是A类IP地址的理论范围。另外我们还可以得知,A类IP地址最多只有128个(实际上是126个,下文不赘述),每个网段内主机上限为2的24次方,也就是16,777,214个。
B类IP地址是前两位为“10“的地址。B类IP地址的前16位是网络标识,用十进制标识的话128.0.0.0-191.255.0.0是B类IP地址的范围。B类IP地址的主机标记长度为16位,因此一个网段内可容纳主机地址上限为65534个。
C类IP地址是前三位为“110”的地址。C类IP地址的前24位是网络标识,用十进制标识的话192.0.0.0-223.255.255.0是C类IP地址的范围。C类地址的后8位是主机标识,共容纳254个主机地址。
D类IP地址是前四位为“1110”的地址。D类IP地址的网络标识长32位,没有主机标识,因此常用于多播。
特殊IP地址:
主机号全为0表示网络本身。
主机号全为1表示本网络的广播地址。
127.0.0.1表示任意主机本身。
0.0.0.0表示整个TCP/IP网络
255.255.255.255表示整个TCP/IP网络的广播地址。
网络地址转化–NAT
通过将专用网络地址(企业内部网)转换为公用地址,从而对外隐藏了内部管理的IP地址。
私有IP地址:10.0.0.0~10.255.255.255、172.16.0.0~172.31.255.255、192.168.0.0~192.168.255.255.
私有IP地址不能直接用于Internet,必须通过网关利用NAT把私有IP地址转换为Internet中合法的全球IP才能用于Internet。
子网掩码
各类地址默认的子网掩码:
A类:255.0.0.0
B类:255.255.0.0
C类:255.255.255.0
使用子网划分时的地址格式:
A类:8位+子网X位+主机24-X位。
B类:16位+子网X位+主机16-X位。
C类:24位+子网X位+主机8-X位。
CIDR无分类编址
消除A类、B类、C类网络划分。可以大幅度提高IP地址空间的利用率,并减少路由表的大小,提高路由器的路由转发能力。
主要特点:
1>IP地址分为网络前缀和主机号。斜线记法:IP地址/网络前缀所占比特数(对应于网络号部分)如:192.168.10.0/20。前20位为网络前缀。
2>将网络前缀都相同的练习IP地址成为“CIDR地址块”,一个CIDR地址块库包括多个A、B、C类地址,这种地址的聚合称为路由聚合,或构成超网。有利于减少路由之间的路由选择信息的交换,从而提高网络性能。
ICMP、ARP、RARP
IP地址到MAC地址的映射,用到ARP(地址解析协议)
ARP(获取MAC地址),每台主机上单独存放一个从IP地址到MAC地址的映射表,称为ARP表。主机和路由器使用地址解析ARP协议来动态维护ARP表。
RARP:物理地址转IP地址。
ICMP协议(数据发送异常通知):ping命令。
ping www.taobao.com 所使用的协议有:ARP(IP到MAC的解析)、ICMP(ping所需)和DNS(域名到IP的解析)
IPV6
由126bit构成,主要变化:
1>更大的地址空间。IPV4是32bit。
2>扩展的地址层次结构
3>灵活的首部格式
4>改进的选项,加快了分组处理的速度
5>允许协议继续扩充。
6>支持即插即用
7>支持资源的预分配
8>增加了安全性,身份验证和保密验证
9>分片限制为由源点来完成,是端到端的,路由途中的路由器不允许进行分片。
数据链路层
用来连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、NIC(网卡)、光纤等传输媒介。
##关于AppStore强制使用HTTPS的 解决方法
- 请公司从CA购买证书
- 请运维同学部署服务器配置SSL层证书(服务器必须支持最新的TLS1.2协议和ECDH加密算法)
- 请开发同学修改原有url为新的https链接
- 请测试同学完整测试应用所有功能, 并确保没有http请求
- 请运营同学在2017年1月1日之后应用在确保所有请求修改为https后再提交审核
- 浏览器类应用和音视频资源文件可仍然使用http链接访问
面试题
- https是怎么实现更安全的连接的?
- 了解哪些常用的加解密,解压缩的方法?
- 有哪些方式来优化网络数据的传输效率;
- 哪些加密是单向的,哪些是双向的?
10.在浏览器输入一个地址,点击回车后发生了什么事情?
分为两种情况:http和https
输入网址,浏览器查找域名的IP地址,浏览器给web服务器发送一个HTTP请求。服务器处理请求,服务器发回一个HTTP响应,浏览器渲染显示HTML
http:
- 浏览器(客户端)进行地址解析
- 将解析出的域名进行DNS解析
- 通过IP寻址和ARP,找到目标(服务器)地址
- 进行TCP三次握手,建立TCP连接
- 浏览器发送数据,等待服务器响应
- 服务器处理请求,并对请求作出响应
- 浏览器收到服务器响应,得到html代码
- 渲染页面
https主要是在http层和tcp层多了一个ssl层,所以在发送数据前会有个ssl握手,发送数据时会有个ssl层的加密。