网络连接流程
0.题记
仅仅是自己的一个知识梳理,不具有参考价值,简单回忆一下网络连接的流程,督促自己查看一下相关资料。目的做到不仅要心知肚明,还要做到言出有评。
大通话,以一次浏览器访问某个网址为例子。(后续要梳理app通过okhttp连接某个网站,然后着重分析下okhttp的底层!)
1.域名解析
一个关键点:DNS解析,也就域名解析,作用是URL---->IP地址,形象一点就是一个电话簿。下面给出俩个参考链接。
网上通篇博客描述的过程其实就是DNS缓存的过程,详情见链接2。
简单顺序就是 :
- 浏览器缓存
- 操作系统缓存
- DNS递归解析器缓存
2.网络连接-3次握手
先拉个文字回忆线。
SYN:Synchronize Sequence Numbers 同步序列编号
ACK:Acknowledge Character 确认字符
- 客户端开启,第一次发送TCP报文(SYN)企图唤醒服务器。
- 标记位SYN,表示“请求建立新连接”
- 序号为seq=x
- 随后客户端进入SYN-SENT阶段
- 服务器端接收到客户端的TCP报文,结束监听,并第一次返回给客户端报文(SYN-ACK)。报文内容如下:
- 标志位:SYN & ACK。表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”;
- 序号:seq=y。这里是服务器新定义的值。
- 确认号为ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值;
随后服务器端进入SYN-RCVD阶段。
- 客户端接收到服务器端的TCP报文,确定数据传输正常,结束SYN-SENT阶段。 第2次返回给客户端TCP报文(ACK)。
- 标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了)
- 序号为seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值
- 确认号为ack=y+1,表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;随后客户端进入ESTABLISHED阶段。
3.建立连接后HTTP请求和响应
3.1 请求格式
POST /adduser HTTP/1.1 //请求方法 URI 协议/版本
Host: localhost:8030 //请求头开始
Connection: keep-alive
Content-Length: 16
Pragma: no-cache
Cache-Control: no-cache
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 //请求头结束
name=name&age=11 //正文...
3.2 响应格式
HTTP/1.1 200 OK // 协议/版本 状态码 状态码描述
Date: Fri, 22 May 2009 06:07:21 GMT //响应头
Content-Type: text/html; charset=UTF-8
<html> //信息主体
<head></head>
<body>
<!--body goes here-->
</body>
</html>
关于响应首行的3位数字状态码,可以直接查表找到对应信息。分为如下5大类。
- 1xx:客户端请求已经被接受,需继续执行;
- 2xx:请求已成功被服务器接收、理解、并接受。
- 200:OK
- 3xx:需要客户端采取进一步的操作才能完成请求(重定向);
- 4xx:请求错误;
- 400:Bad Request:语义有误/请求参数有误
- 404:请求失败,请求所希望得到的资源未被在服务器上发现。
- 403:服务器已经理解请求,但是拒绝执行它。
- 5xx/6xx:服务器在处理请求的过程中有错误或者异常状态发生
- 500:服务器端的源代码出现错误时出现。(服务器崩了)
- 503:维护/过载
4.客户端操作
接收到服务器的返回值,解析并进行操作。
5.断开连接-4次挥手
目的是终止终止TCP连接。四次挥手就是客户端和服务端之间,总共发送4个包用来确认并完成断开连接。
- TCP客户端发送一个FIN=x,请求关闭。客户端进入FIN_WAIT_1
- 服务器收到FIN报文,返回ACK=x+1。客户端进入FIN_WAIT_1
- 服务器关闭客户端的连接,发送FIN=y给客户端。服务器端进入LAST_ACK
- 客户端收到并发回报文ACK=y+1确认,并将确认序号设置为收到序号加1。客户端发送报文后进入TIME_WAIT,等待超时无回复后关闭。
发送FIN=y给客户端。
吐槽
2020年5月20日00:53:16
我去,我用Typora编辑的.md,上传到CSDN之后发现格式竟然有了变化,只能一点一点修改,醉了(本地图片要重新上传,连接格式不一样,真的无力吐槽)。
努力可能会撒谎,但是努力一定不会白费!最近很喜欢这句话,朋友圈发出来了又删掉了,感觉自己有点矫情。加油,向跟我一样同样在这个点奋斗的码农致敬~