Java笔记 | 计算机网络
- cookie 与 session
存储位置:
--cookie保存在客户端。
--session保存在服务器。
存储容量:
--cookie<=4kb,一个站点最多保存20个cookie。
--session无限制,但一般很小,且设置有删除机制。
存储方法:
--cookie只能保存ASCII字符串,需要通过编码方式存储Unicode或二进制数据。
--session可以存储任何类型的数据。
隐私策略:
--cookie可在本地查看,不安全。
--session存放在服务器上,对服务器透明,安全。
有效期:
--cookie可以设置属性达到长期有效。
--session不能长期有效。
作用:
--cookie用于记录用户信息。
--session用于跟踪用户状态。
- GET 与 POST
参数:
-- get 提交的数据会放在 URL 之后,并且请求参数会被完整的保留在浏览器的记录里,由于参数直接暴露在 URL 中,可能会存在安全问题,因此往往用于获取资源信息。
-- post 参数放在请求主体中,并且参数不会被保留,相比 get 方法,post 方法更安全,主要用于修改服务器上的资源。
请求编码:
-- get 请求只支持 URL 编码。
-- post 请求支持多种编码格式。
参数格式:
-- get 只支持 ASCII 字符格式的参数。
-- post 方法没有限制。
大小:
-- get 提交的数据大小有限制(这里所说的限制是针对浏览器而言的)。
-- post 方法提交的数据没限制。
- HTTP
HTTP是TCP/IP协议中的 应用层 协议。它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式,是互联网信息交互中最常用的协议。
特点:
--简单快速。只需要传 请求方法 与 资源路径 就能确定资源。
--灵活。传输 任意类型 的数据。
--无连接。一般一次连接只处理一个请求,结束后主动释放连接,但在HTTP1.1中可以使用keep-alive来复用相同的TCP连接发送多个请求。
--无状态。客户端向服务器发送HTTP请求之后,服务器会给我们发送数据过来,但不会记录任何信息。
- HTTP与HTTPS
HTTP 协议以明文方式发送内容,数据都是未加密的,安全性较差。HTTPS 数据传输过程是加密的,安全性较好。
HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80 端口,后者是 443 端口。
HTTPS 协议需要到数字认证机构(Certificate Authority, CA)申请证书,一般需要一定的费用。
HTTP 页面响应比 HTTPS 快,主要因为 HTTP 使用 3 次握手建立连接,客户端和服务器需要握手 3 次,而 HTTPS 除了 TCP 的 3 次握手,还需要经历一个 SSL 协商过程。
- HTTPS连接建立过程
1.客户端给服务器发送一个请求。
2.服务器发送一个SSL证书给客户端,内容包括证书的发布机构、有效期、所有者、签名以及公钥。
3.客户端对发来的公钥进行真伪校验,校验为真则使用公钥对对称密钥进行加密,并将信息发送给服务器。
4.服务器端使用私钥进行解密并使用对称密钥加密确认信息发送给客户端。
5.随后客户端和服务端就使用对称密钥进行信息传输。
在握手阶段使用非对称加密,在传输阶段使用对称加密。
- 对称加密算法 和 非对称加密算法
对称加密算法:双方持有相同的密钥,且加密速度快,典型对称加密算法:DES、AES
非对称加密算法:密钥成对出现(私钥、公钥),私钥只有自己知道,不在网络中传输;而公钥可以公开。相比对称加密速度较慢,典型的非对称加密算法有:RSA、DSA
- TCP三次握手
客户端:OPEN -> SYN_SENT
SYN=1 seq=x
服务器:LISTEN -> SYN_RECV
SYN=1 ACK=1 seq=y ack=x+1
客户端:SYN_SENT -> ESTABLISHED
ACK=1 seq=x+1 ack=y+1
- 为什么是三次握手?
三次握手的主要目的是确认自己和对方的发送和接收都是正常的,从而保证了双方能够进行可靠通信。若采用两次握手,当第二次握手后就建立连接的话,此时客户端知道服务器能够正常接收到自己发送的数据,而服务器并不知道客户端是否能够收到自己发送的数据。
- TCP四次挥手
假设客户端主动释放连接
客户端:ESTABLISHED -> FIN_WAIT_1
FIN=1 seq=u
服务器:ESTABLISHED -> CLOSE_WAIT
ACK=1 seq=v ack=u+1
服务器:CLOSE_WAIT -> LAST_ACK
FIN=1 ACK=1 seq=w ack=u+1
客户端:FIN_WAIT_2 -> TIME_WAIT
ACK=1 seq=u+1 ack=w+1
- 为什么是四次挥手?
释放 TCP 连接时之所以需要四次挥手,是因为 FIN 释放连接报文和 ACK 确认接收报文是分别在两次握手中传输的。 当主动方在数据传送结束后发出连接释放的通知,由于被动方可能还有必要的数据要处理,所以会先返回 ACK 确认收到报文。当被动方也没有数据再发送的时候,则发出连接释放通知,对方确认后才完全关闭TCP连接。
- CLOSE_WAIT 和 TIME_WAIT 的区别
CLOSE_WAIT:在服务器收到客户端关闭连接的请求并告诉客户端自己已经成功收到了该请求之后,服务器进入了 CLOSE-WAIT 状态,然而此时有可能服务端还有一些数据没有传输完成,因此不能立即关闭连接,而 CLOSE-WAIT 状态就是为了保证服务器在关闭连接之前将待发送的数据发送完成。
TIME_WAIT:当客户端向服务端发送 ACK 确认报文后进入该状态,若取消该状态,即客户端在收到服务端的 FIN 报文后立即关闭连接,此时服务端相应的端口并没有关闭,若客户端在相同的端口立即建立新的连接,则有可能接收到上一次连接中残留的数据包,可能会导致不可预料的异常出现。除此之外,假设客户端最后一次发送的 ACK 包在传输的时候丢失了,由于 TCP 协议的超时重传机制,服务端将重发 FIN 报文,若客户端直接关闭的话,当收到服务端重新发送的 FIN 包时,客户端就会用 RST 包来响应服务端,这将会使得对方认为是有错误发生,然而其实只是正常的关闭连接过程,并没有出现异常情况。
- TIME_WAIT 等待2MSL
当客户端发出最后的 ACK 确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完 ACK 确认报文之后,会设置一个时长为 2 MSL 的计时器。MSL(Maximum Segment Lifetime),指一段 TCP 报文在传输过程中的最大生命周期。2 MSL 即是服务器端发出 FIN 报文和客户端发出的 ACK 确认报文所能保持有效的最大时长。
- TCP 和 UDP 的区别
TCP:面向连接、可靠、有序、延迟大、一对一,传输字节流,首部20~60字节。应用:FTP、SSH、SMTP、HTTP。
UDP:无连接、不可靠、无序、延迟小、可对多,传输报文,首部8字节。应用:流媒体、实时游戏、物联网。
UDP的优势:
--网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使应用层重传,能够确保传输的可靠性。
--TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制机制算法,建立了繁琐的握手过程,由于TCP内置于系统协议栈中,极难对其进行改进。
--基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络对进程造成影响。
- TCP 拥塞控制
慢启动、拥塞避免、快重传、快恢复。
- TCP 滑动窗口(流量控制)
发送窗口只有收到窗口内字节的ACK确认,才会移动发送窗口的左边界。
接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。
遵循快速重传、累计确认、选择确认等规则。
- 网页解析全过程
DNS 解析:当用户输入一个网址并按下回车键的时候,浏览器获得一个域名,而在实际通信过程中,我们需要的是一个 IP 地址,因此我们需要先把域名转换成相应 IP 地址。
TCP 连接:浏览器通过 DNS 获取到 Web 服务器真正的 IP 地址后,便向 Web 服务器发起 TCP 连接请求,通过 TCP 三次握手建立好连接后,浏览器便可以将 HTTP 请求数据发送给服务器了。
发送 HTTP 请求:浏览器向 Web 服务器发起一个 HTTP 请求,HTTP 协议是建立在 TCP 协议之上的应用层协议,其本质是在建立起的TCP连接中,按照HTTP协议标准发送一个索要网页的请求。在这一过程中,会涉及到负载均衡等操作。
处理请求并返回:服务器获取到客户端的 HTTP 请求后,会根据 HTTP 请求中的内容来决定如何获取相应的文件,并将文件发送给浏览器。
浏览器渲染:浏览器根据响应开始显示页面,首先解析 HTML 文件构建 DOM 树,然后解析 CSS 文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。
断开连接:客户端和服务器通过四次挥手终止 TCP 连接。
- ISO/OSI参考模型
1.物理层
2.数据链路层
Ethernet、PPP、CSMA、HDLC
3.网络层
IP、ARP、ICMP、BGP、RIP、OSPF
4.传输层
TCP、UDP、RTP、SCTP
5.会话层
RPC
6.表示层
7.应用层
HTTP、FTP、SMTP、SSH、Telnet