第一阶段
输入网址
准确地说叫URL,包括了http:,ftp:,file:等等格式。意义是访问不同的服务器,Web服务器,FTP服务器……
浏览器解析URL
拆分URL中的元素,通过拆分这些元素,能够知道要访问的服务器域名和具体文件路径
HTTP协议
HTTP协议定义了客户端和服务器交互的消息内容和步骤,客户端发的消息分两部分,操作谁?干什么?第一部分就是目标名,第二部分包括HTTp的方法,主要有GET,POST,HEAD,OPTIONS,PUT,DELETE。处于数据保护的目的,GET,POST用的相对多一些
生成HTTP请求
请求消息:第一行为请求行(大致了解请求行内容),然后接一个消息头,消息体。
响应消息:状态行-消息头-消息体
发送请求后会收到响应
状态码
1XX:告知请求处理进度
2XX:成功
3XX:需要进一步操作
4XX:客户端错误
5XX:服务器错误
收到状态码后,浏览器提取数据,就可以看到网页的大致样子了,如有图片等资源,则还要根据标签留出空间,根据需要再次访问Web服务器
向DNS服务器查询IP地址
HTTP消息需要靠TCP/IP协议在网络中发送,这时需要服务器的IP地址。这时操作系统先查本地hosts文件有没有定义,没有的话查最近的DNS服务器,像windows会根据TCP/IP设置里的DNS去查询。当然DNS服务器本身也是分层的。通过.来分割成不同的域。DNS之间也存在互相查询的情况
第二阶段
应用程序(Socket,解析器)-操作系统(TCP/IP,ICMP,ARP,RIP)-驱动程序(网卡驱动)-硬件(网卡)
套接字
通信流程
服务端:Bind-Listen-Accept-Read/Write-Close
客户端:Connect-Write/Read-Close
Connect和Accept的过程会用到三次握手,Close关闭连接会用到四次挥手
对数据进行处理
HTTP数据消息过长需要拆分,过短会产生粘包情况。
使用ACK号确认网络包是否已收到
超时重传:收到数据包后要返回ACK号,若没有返回,则发送方在一定时间后重发数据包。此外,由于网络本身的这个机制,网卡,路由器不需要再有错误补偿机制,检测到错误就丢弃包即可
滑动窗口:由于可能出现接收方的ACK因为网络堵塞晚一点到的情况。如果发送方等待时间过短,可能还是会重发数据包,造成网络更堵;所以需要等待时间长一点,但是这样无疑又损害了正常情况下网络传输效率。故引入滑动窗口方式,发完一个数据包,继续发下一个,把等ACK的时间利用起来。接收到的数据先存进缓冲区,为了避免溢出需要告诉发送方自己还能接受多少数据,从而供发送方动态地调整自己发送的数据
四次挥手
A发FIN,B发ACK,B发FIN,A发ACK
为什么最后A(发送FIN报文方)要等2MSL
如果B最后没接到ACK,可能会再发一次FIN,但这时A如果套接字已经删除,恰好同一个端口又被分配了新的套接字,重传的FIN报文就会就会跑到新的套接字里。
具体等待多长时间没有明确规定。30s~2min都有可能
数据包的基础知识
TCP/IP包的结构
MAC头部-- IP头部–TCP头部–数据块
ARP查MAC地址:广播问这个IP的MAC是啥
HTTP协议
HTTP消息结构:请求行,请求头,空行,请求数据(下面以POST为例)
1,请求行包括请求方法,URL,HTTP协议三部分
2,请求头就是一个键值对类型
Host:请求主机名
User-Agent:用的浏览器类型
Connection:连接类型长连接
3,空行
表示请求头结束,开始发送请求体了
4,请求数据通常是一个JSON格式的字符串(如果有的话)