一、理解TCP/IP, HTTP, socket, Nginx, chrome
HTTP 协议是基于 TCP/IP 协议的应用层协议。HTTP 协议的网络层基于 IP 协议,传输层基于 TCP 协议。
TCP/IP 协议需要向程序员提供可编程的 API,该 API 就是 Socket,它是对 TCP/IP 协议的一个重要的实现。
提供服务端能力的称作ServerSocket,提供客户端能力的称作Socket。
Nginx:基于 Socket 实现的HTTP服务器;OkHttp、URLCollection 等都是基于 Socket 实现的 HTTP 客户端,而浏览器就是这些 HTTP 客户端的具象。
二、数据报结构
IP数据报结构:
不过 32 位可以表示的 IP 地址是有限的,中国拥有近 3 亿左右个 IP 地址,无奈中国的网民实在太多了,于是使用了 IP 地址转换技术 NAT。例如 ABC 三个小区的所有设备可能公用了一个公网 IP,通过 NAT 技术分给每一户一个私有 IP 地址,大家在小区内交流时可能使用的是私有 IP 地址,但是向外交流时就用公网 IP。
如果让多个域名都解析到同一个 IP 地址,那么这么这个主机就拥有了多个别名,当外部应用通过不同的域名来连接该主机时,在该主机内部就可以通过不同的别名(端口),把该连接指向不同的应用。
当客户端使用域名连接服务端的时候,需要通过 IP 寻址来确定服务器在网络中的位置,主要是以下两步;
-
通过 hosts 或者 DNS 查找主机名对应的 IP 地址
-
通过 ARP 寻址查找主机对应的 MAC 地址
通过 DNS 缓存来查找域名对应的 IP 地址,一般情况下有这么几级:
-
查找系统的 hosts 中配置的 DNS 映射
-
查找系统自身的 DNS 缓存
-
查找路由器中的 DNS 缓存
-
查找 IPS 的 DNS 缓存
三、TCP数据报结构
-
SYN:建立连接标识
-
ACK:响应标识
-
FIN:断开连接标识
-
seq:seq number,发送序号
-
ack:ack number,响应序号
建立 TCP 连接,3 次握手
-
客户端发送SYN, seq=x,进入 SYN_SEND 状态
-
服务端回应SYN, ACK, seq=y, ack=x+1,进入 SYN_RCVD 状态
-
客户端回应ACK, seq=x+1, ack=y+1,进入 ESTABLISHED 状态,服务端收到后进入 ESTABLISHED 状态
进行数据传输
-
客户端发送ACK, seq=x+1, ack=y+1, len=m
-
服务端回应ACK, seq=y+1, ack=x+m+1, len=n
-
客户端回应ACK, seq=x+m+1, ack=y+n+1
断开 TCP 连接, 4 次挥手
-
主机 A 发送FIN, ACK, seq=x+m+1, ack=y+n+1,进入 FNIWAIT1 状态
-
主机 B 回应ACK, seq=y+n+1, ack=x+m+1,进入 CLOSEWAIT 状态,主机 A 收到后 进入 FINWAIT_2 状态
-
主机 B 发送FIN, ACK, seq=y+n+1, ack=x+m+1,进入 LAST_ACK 状态
-
主机 A 回应ACk, seq=x+m+1, ack=y+n+1,进入 TIME_WAIT 状态,等待主机 B 可能要求重传 ACK 包,主机 B 收到后关闭连接,进入 CLOSED 状态或者要求主机 A 重传 ACK,客户端在一定的时间内没收到主机 B 重传 ACK 包的要求后,断开连接进入 CLOSED 状态
四、HTTP报文结构