TCP/IP
TCP/IP模型
| 协议 | 备注 |
应用层 | FTP、DNS、HTTP | 决定了向用户提供应用服务时通信的活动 |
传输层 | TCP、UDP | 提供处于网络连接中的两台计算机的数据传输 |
网络层 | IP、ICMP、ARP、RARP | 处理在网络上流动的数据包(数据包是网络传输的最小单位),该层规定了传输路线。 |
链路层 | 操作系统、硬件的设备驱动、NIC(网络适配器/网卡) | 处理连接网络的硬件部分 |
TCP/UDP
TCP和UDP都是传输层协议,但两者具有不同的特性和不同的应用场景。
面向报文:是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,ip层需要分片,降低效率;若太短,会使IP太小。
面向字节流:应用程序和TCP的交互式一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP就有个缓冲,当应用程序传送的数据块太长,TCP
就会把他划分短一些再传送。
-
TCP和UDP协议的一些应用
使用场景:
TCP: 当对网络通讯质量有要求的时候,比如整个数据要准确无误的传送给对方,往往用于一些要求可靠地应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
UDP: 对网络通讯质量要求不高,要求网络通讯速度尽量快。
DNS
Domain Name System(域名系统),互联网上作为域名和IP地址相互映射的分布式数据库,能够使用户更方便的访问互联网,而不用去记住能被机器直接读取的IP数串。通过主机名得到该主机对应IP地址的过程叫做域名解析。DNS协议运行在UDP协议之上,使用端口号53。
TCP的建立和断开
三次握手
- 发送端首先发送一个带有SYN标志的数据包给服务器端,请求建立连接。
- 服务器端收到后,会返回一个带有SYN和ACK标志的数据包传达确认信息。
- 发送端收到带有确认信息的数据包后,返回一个带有ACK标志的数据包,代表握手成功。
为什么采用三次握手?
防止失效的数据包传送到服务器端,发生错误。
四次挥手
- 客户端向服务器端发送FIN,表示请求断开连接,此时客户端处于FIN-WAIT-1状态。
- 服务器端收到断开连接请求后,发送ACK确认报文。此时服务器进入CLOSE-WAIT状态并持续一段时间,客户端处于FIN-WAIT-2状态。
- 直到服务器端发送完数据,向对方发送FIN/ACK,表示数据传送完毕,可以断开连接。服务器进入LAST-ACK(最后确认)状态。
- 客户端收到FIN后,发送ACK确认断开连接,服务器端会进入CLOSED状态,但客户端进入TIME-WAIT(时间等待状态),经过2MSL的时间后,才进入CLOSED状态。
为什么客户端最后要等待2MSL
- 为了保证客户端最后发送的ACK能够到达服务器端。在2MSL时间内,如果服务器端还没有收到客户端的确认报文,会重新发送一次,客户端就可以重新发送ACK。
- 为了防止“失效的数据出现在服务器端”。在2MSL时间内,产生的所有报文段都从网络中消失。
为什么建立连接是三次,断开连接是四次
建立连接时,被动方收到请求报文时,把SYN和ACK 放在一个报文里发送给客户端。
断开连接时,被动方收到请求后,先发送确认报文表示我收到请求了,但数据还没发送完不能立刻关闭,所以,等数据全部传送完毕后,发送FIN报文请求关闭连接,这里把FIN和ACK分两次发送,所以是四次挥手。
HTTP
HTTP的基本优化
影响一个HTTP网络请求的因素有两个:宽带和延迟(浏览器阻塞、DNS查询、建立连接)。
HTTP1.0和HTTP1.1的区别
- 缓存处理:HTTP1.1引入了更多的缓存控制;
- 宽带优化:HTTP1.1请求引入range头域,允许请求资源的某个部分。
- 错误的通知处理:新增了24个错误状态码。
- Host头处理:一台计算机上会有多个虚拟主机,且共享同一个IP地址,所以HTTP1.1 的请求和响应中增加了host头域,如果不带会报错。
- 长连接:HTTP1.1在一次TCP连接和断开中可以进行多次请求和响应,减少了多次 TCP建立和断开的消耗和延迟。(keep-alive)
HTTPS和HTTP的区别
HTTP的缺点:
- 通信使用明文(不加密),通信内容可能会被窃听;
- 不验证通信方的身份,可能遭到伪装;
- 不能证明报文的完整性,可能已遭篡改。
HTTPS是身披SSL外壳的HTTP,能够解决以上HTTP的问题。
SSL是一种网络安全技术,运行在TCP之上,HTTP之下。
他们的端口不一样,HTTP是80,HTTPS是443.
HTTP----->SSL------->TCP
SPDY:HTP1.x的优化
(核心思想:尽量减少TCP的连接数)
1.多路复用:通过单一的TCP连接,可以处理多个HTTP请求。
2.请求优先级:给请求分配优先级。
3.压缩HTTP首部
4.推送功能:支持服务器端主动向客户端推送数据的请求。
5.服务器提示功能:服务器主动提示客户端请求所需的资源,在资源已缓存的情况下,可以避免发生不必要的请求。
HTTP------>SPDY------>SSL------->TCP
HTTP2.0:SPDY的升级版
1.二进制传输:HTTP1.x的解析是基于文本的,但文本的形式多样。二进制只有0和1 的组合,实现方便且健壮。
2.多路复用:解决同一域名下请求数量过多造成队头阻塞问题。在一个TCP连接中可以 有多个流,即可以发送多个请求。在客户端,帧可以乱序发送,(每个帧都会标识属于 哪个流)到对端后,根据帧首部的流标识重新组装。
3.header压缩:对header进行了压缩,减小了大小,又在两端建立了Header索引表, 后面在传输过程中就可以传输已经记录过的header键名。
4.服务器推送:提前给客户端提供必要的资源。
HTTP方法
GET:获取资源
POST:传输资源
PUT:传输文件(不安全)
HEAD:获得报文首部
DELETE:删除文件/资源(不安全)
OPTIONS:询问支持的方法
GET和POST的区别
| GET | POST |
1 | 回退时是无害的 | 会再次提交请求 |
2 | 提交的URL可以被收藏 | 不可以 |
3 | 请求会被浏览器主动缓存 | 不会 |
4 | 请求参数会被完整的保存在历史记录 | 不会 |
5 | 只能进行URL编码 | 支持多种编码方式 |
6 | URL参数有长度限制 | 没有限制 |
7 | 只接受ASCII字符 | 没有限制 |
8 | 参数通过URL传递,不安全 | 参数在request body中 |
|
|
|
HTTP报文组成
报文首部+报文主体
报文首部:请求行/状态行+请求/响应首部字段+通用首部字段+实体首部字段
请求行:请求方法+请求URI+协议版本
状态行:状态码+协议版本
HTTP是不保存状态的协议(cookie引入)
Cookie localstorage和 sessionstorage
1.cookie会随请求发送到服务器;
2.有效时间:cookie设置失效时间;sessionStorage仅在会话关闭前有效,localStorage除非手动清除,否则永久有效;
3.存储量:cookie小(4k左右);webStorage(大致5MB)
Cookie 和session
Session在服务器里,cookie在客户端;
Session运行依赖session id,而session id存在cookie中。
持久连接keep-alive
只要任一方没有提出断开连接请求,就可以保持TCP连接状态。
管线化
同时并行发送多个请求
HTTP状态码
状态码类别 | 类别 | 原因短句 |
1xx | Informational(信息性状态码) | 接收的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完成 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务器端错误) | 服务器处理请求出错 |
状态码 | 原因短句 | 说明 |
200 | OK | 客户端发来的请求在服务器端正常处理了 |
301 | Moved Permanently | 永久重定向 |
302 | Found | 临时重定向 |
304 | Not Modified | 客户端有缓存的资源,可直接使用 |
404 | Not Found | 服务器上找不到请求的资源 |
500 | Internal Server Error | 服务器端在执行请求时发生错误 |
浏览器内多个标签页进行通讯
- WebSocket:web浏览器与web服务器之间全双工通信标准。
- Cookie:在页面设置一个定时器不断刷新,检查Cookies值是否变化。
- localStorage:是多个标签共用的存储空间。
- sharedWorker:h5新特性,可以被同源的多个window共同使用。
Web攻击技术
CSRF(跨站点请求伪造)
XSS(跨站脚本攻击)
跨域
同源策略:协议+域名+端口
- JSONP:动态插入js标签,通过Script标签引入一个JS文件,这个JS文件加载后 会执行我们在URL中写入的回调函数,并且把我们需要的json数据作为参数传入。
- CORS:服务器在响应头设置相应选项,浏览器如果支持这种方法的话就将这种跨 站资源视为合法,进而取得资源。
- Document.domain:仅限主域相同,子域不同的应用场景。
- webSocket:不受同源策略限制。