[TOC]html
@(iOS总结)ios
一切从简,用本身的方式记录。若是你以为啰嗦,那多是我怕说的不明白;若是你以为太笼统,那多是我以为太基础没写出来,或者我还没认知到;若是你以为和别的文章过重复,那多是我没有找到更好的表达方式;git
系统学习最好看一下 UNIX网络编程卷1:套接字联网API(第3版).pdfgithub
TCP
位于传输层,传输层协议还包括UDP
、HTTP
(超文本传输协议)、FTP
(文件传输协议)、SNMP
(简单网络管理协议)、Telnet
(远程登陆协议)等。下面的表格列出了TCP
和UDP
的区别。算法
传输层协议 | TCP(Transmission Control Protocol传输控制协议) | UDP(User Datagram Protocol用户数据报协议) |
---|---|---|
链接方式 | 面向链接(一对一) | 无链接(一对1、一对多、多对1、多对多) |
占用系统资源 | 多(首部开销20字节) | 少(首部开销8字节) |
可靠性 | 可靠,保证数据正确(全双工) | 不可靠,可能会丢包 |
数据顺序 | 保证数据顺序 | 不保证数据顺序 |
拥塞控制 | 有拥塞控制,面向数据流 | 无拥塞控制,面向报文 |
流量控制 | 有(滑动窗口) | 无 |
注意: “
ping
”命令是使用 IP 和网络控制信息协议 (ICMP
),于是没有涉及到任何传输协议(UDP/TCP
) 和应用程序编程
TCP
由于是面向链接的,因此比UDP
要更复杂,创建链接须要三次握手
,断开链接须要四次挥手
。TCP充分实现了数据传输时各类控制功能,能够进行丢包的重发控制
,还能够对次序乱掉的分包进行顺序控制
。而这些在UDP中都没有。此外,TCP做为一种面向有链接的协议,只有在确认通讯对端存在时才会发送数据,从而能够控制通讯流量的浪费。TCP经过检验和
、序列号
、确认应答
、重发控制
、链接管理
以及窗口控制
等机制实现可靠性传输
。 浏览器![]()
假如让我和你来实现一次完整可靠的链接,会怎么作呢?安全
我
告诉你
我要和你创建链接你
告诉我
你能收到我发送的消息我
告诉你
我能收到你发送的消息 而后,你能收到我发送的,我能收到你发送的,咱俩下面就能够畅聊了我
告诉你
,我要和你断开链接你
告诉我
,你收到我发送的断开链接消息了,可是可能还有数据没有发送完毕,等一会再告诉我你
告诉我
,你没有正在发送的数据了,你能够和我断开链接了我
告诉你
,我收到你发送的能够和我断开链接的消息了 而后,本次会话完美结束了,没有漏掉任何消息所谓的流量控制
就是接收方让发送方的发送速率
不要太快,让接收方来得及接收。利用滑动窗口机制
能够很方便的在TCP链接上实现对发送方的流量控制。TCP窗口的单位是字节,不是报文段,发送方的发送窗口
不能大于接收方给出的接收窗口
(rwnd)的大小。bash
为了方式网络的拥塞现象,TCP提出了一系列的拥塞控制机制
。拥塞控制的原理主要依赖于一个拥塞窗口(cwnd)
,发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就增大一写,以便把更多的分组发送出去。可是只要出现网络拥塞,拥塞窗口就减小一些,以便减小注入到网络中的分组。主要有四种算法:慢启动(Slow-start)
、拥塞避免(Congestion Avoidance)
、快重传(Fast Restrangsmit)
、快恢复(Fast Recovery)。服务器
拥塞控制和流量控制的区别
区别 | 拥塞控制 | 流量控制 |
---|---|---|
做用范围 | 全局性的(设计全部主机、路由器、以及与下降网络传输性能有关的全部因素) | 点对点的通讯量控制,是个端到端的问题 |
控制方 | 发送方控制 | 接收方控制 |
控制结果 | 控制发送方注入到网络中的数据量 | 控制发送端的发送数据速率,以便接收端来得及接收 |
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。规范把 HTTP 请求分为三个部分:状态行
、请求头
、消息主体
。
统一资源定位符(Uniform Resource Locator)是网络资源的位置和访问方法的简洁表示。常见的url包括4个部分,结构以下图:
组件 | 含义 |
---|---|
方案 | 使用的协议,如http或https |
主机 | 服务器的域名或IP地址 |
路径 | 服务器上资源的本地名,用(/)与前面的scheme分隔开来 |
查询字符串 | 经过查询字符串来减少请求资源类型的范围,如参数 |
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别: 1xx:指示信息--表示请求已接收,继续处理 2xx:成功--表示请求已被成功接收、理解、接受 3xx:重定向--要完成请求必须进行更进一步的操做 4xx:客户端错误--请求有语法错误或请求没法实现 5xx:服务器端错误--服务器未能实现合法的请求
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经受权,这个状态代码必须和WWW-Authenticate报头域一块儿使用
403 Forbidden //服务器收到请求,可是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
复制代码
根据HTTP标准,HTTP请求可使用多种请求方法。 HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 相似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会致使新的资源的创建和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给可以将链接改成管道方式的代理服务器。
OPTIONS 容许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
复制代码
TCP
协议对应于传输层,HTTP
协议对应于应用层,从本质上来讲两者没有可比性。 不少人喜欢把IP
比做告诉公路,TCP
是告诉公路上的卡车,他们携带的货物就是HTTP
协议。 我以为这是很不严谨的,若是非要举个形象的例子,我以为能够把IP
比做电话号码
,TCP
就像电话
,传输去的声音
就像数据包
,若是是开会就会遵循电话会议规则(好比HTTP
),若是是销售就会遵循推销规则(好比FTP
),若是是闲聊就按照双方想要的规则(自定义数据传输协议
)。TCP
传输的数据包能够任何格式的,能够自定义规则
,能够遵循HTTP
协议,也能够遵循FTP
协议。
使用Cookie来解决无状态的问题,Cookie就至关于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。
https, 全称Hyper Text Transfer Protocol Secure,相比http,多了一个secure。一句话:HTTPS=HTTP+加密+认证+完整性保护
。
理清几个概念很重要
浏览器
、操做系统
、或者应用
本身内置了信任的根证书
,浏览器或者客户端接收到服务器返回的的CA颁发的数字证书,从内置信任的根证书中获取CA的公钥,而后对服务器返回的数字证书中的签名进行解密获得摘要1,而后对服务器返回的数字证书中的内容进行取摘要运算获得摘要2,最后对比摘要1与摘要2是否相等,继而判断服务方是不是被CA认证的服务方。
一、认证(Authentication)
:没法确认与我正在通讯的人,就是我真正想通讯的人
二、泄露(privacy)
:与我通讯的内容,被别人偷听
三、篡改(data integrity)
:我接受到的的内容,并非对方原始发送的数据
SSL不解决如下问题: 不可抵赖性(消息的发送者没办法不认可消息是本身发出的)。由于SSL并不对传输的数据作签名。可是SSL加上数字签名证书能够解决该问题。
HTTPS使用了数字证书(身份认证机构盖在数字身份证上的一个章或印,或者说加在数字身份证上的一个签名),这一行为表示身份认证机构已认定这我的,证书的合法性能够向CA验证。客户端收到服务器的响应后,先向CA验证证书的合法性,若是校验不经过浏览器就会终止链接,并提示用户证书不安全。 数字证书的组成:
就是对数据进行加密,一般使用两种加密算法:对称加密
、非对称加密
。
对称加密: 加密和解密使用相同的密钥,有点是加解密速度快,缺点是密钥丢失后没法作到保密,经常使用的有AES、DES。 非对称加密: 有一对密钥,公钥(向全部人开放)和私钥(不对外开放)。公钥加密的数据只能私钥解密,私钥加密的数据只能公钥解密,利用这种特性能够用来校验数字签名。
HTTPS的解决方案是这样的:用非对称算法随机加密出一个对称密钥,而后双方用对称密钥进行通讯。具体来讲,就是客户端生成一个随机密钥,用服务器的公钥对这个密钥进行非对称加密,服务器用私钥进行解密,而后双方就用这个对称密钥来进行数据加密了。
哈希算法能够将任意长度的数据转化成固定大小的字符串,而且该过程不可逆,利用这个特性作数据完整性的校验。
要点: 使用公钥对摘要加密获得签名,使用私钥解密签名获得公钥
为何须要数字证书? 由于网络通讯的双方均可能不认识,那么就须要第三方介绍,这就是数字证书。数字证书是由Certificate Athority(CA认证中心)颁发的。
Charles
可以抓取HTTPS报文?经过上面的分析,咱们知道HTTPS能够有效防止中间人攻击,可是Charles
,Fiddler
是能够抓取HTTPS请求并解密的,它们是如何作到的呢?
Charles做为一个中间人代理
,当浏览器和服务器通讯时,Charles接收服务器的证书,但本身动态生成一张证书发送给浏览器,也就是说Charles做为中间代理在浏览器和服务器之间通讯,因此通讯的数据能够被Charles拦截并解密。因为Charles更改了证书,浏览器校验不经过会给出安全警告,必须安装Charles的证书后才能进行正常访问。
一、客户端向服务器发起HTTPS请求
二、Charles拦截客户端的请求,假装成客户端向服务器进行请求
三、服务器向“客户端”(其实是Charles)返回服务器的CA证书
四、Charles拦截服务器的响应,获取服务器证书公钥,而后本身制做一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
五、客户端接收到“服务器”(其实是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
六、Charles拦截客户端的响应,用本身的私钥解密对称密钥,而后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
七、服务器用本身的私钥解密对称密钥,向“客户端”(Charles)发送响应
八、Charles拦截服务器的响应,替换成本身的证书后发送给客户端
至此,链接创建,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,以后就能够解密或者修改加密的报文了。
HTTPS抓包的原理仍是挺简单的,简单来讲,就是Charles做为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS链接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,不然客户端就会“报警”并停止链接。这样看来,HTTPS仍是很安全的。