描述网络连接流程

网络连接流程

0.题记

仅仅是自己的一个知识梳理,不具有参考价值,简单回忆一下网络连接的流程,督促自己查看一下相关资料。目的做到不仅要心知肚明,还要做到言出有评。

大通话,以一次浏览器访问某个网址为例子。(后续要梳理app通过okhttp连接某个网站,然后着重分析下okhttp的底层!)

1.域名解析

一个关键点:DNS解析,也就域名解析,作用是URL---->IP地址,形象一点就是一个电话簿。下面给出俩个参考链接。

DNS百度百科
什么是DNS

网上通篇博客描述的过程其实就是DNS缓存的过程,详情见链接2。

简单顺序就是 :

  • 浏览器缓存
  • 操作系统缓存
  • DNS递归解析器缓存

2.网络连接-3次握手

先拉个文字回忆线。
SYN:Synchronize Sequence Numbers 同步序列编号
ACK:Acknowledge Character 确认字符

  1. 客户端开启,第一次发送TCP报文(SYN)企图唤醒服务器。
    • 标记位SYN,表示“请求建立新连接”
    • 序号为seq=x
    • 随后客户端进入SYN-SENT阶段
  2. 服务器端接收到客户端的TCP报文,结束监听,并第一次返回给客户端报文(SYN-ACK)。报文内容如下:
    • 标志位:SYN & ACK。表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”;
    • 序号:seq=y。这里是服务器新定义的值。
    • 确认号为ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值;
      随后服务器端进入SYN-RCVD阶段。
  3. 客户端接收到服务器端的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个包用来确认并完成断开连接。

  1. TCP客户端发送一个FIN=x,请求关闭。客户端进入FIN_WAIT_1
  2. 服务器收到FIN报文,返回ACK=x+1。客户端进入FIN_WAIT_1
  3. 服务器关闭客户端的连接,发送FIN=y给客户端。服务器端进入LAST_ACK
  4. 客户端收到并发回报文ACK=y+1确认,并将确认序号设置为收到序号加1。客户端发送报文后进入TIME_WAIT,等待超时无回复后关闭。
    发送FIN=y给客户端。

吐槽

2020年5月20日00:53:16
我去,我用Typora编辑的.md,上传到CSDN之后发现格式竟然有了变化,只能一点一点修改,醉了(本地图片要重新上传,连接格式不一样,真的无力吐槽)。
努力可能会撒谎,但是努力一定不会白费!最近很喜欢这句话,朋友圈发出来了又删掉了,感觉自己有点矫情。加油,向跟我一样同样在这个点奋斗的码农致敬~

猜你喜欢

转载自blog.csdn.net/ma598214297/article/details/106226411
今日推荐