12

DNS域名解析

首先浏览器拿到我们的url,会将我们的url解析出来,然后拿到域名部分,由于我们的包在互联网上传输是根据ip地址来寻找下一个转发点,所以如果我们以我们的域名来当作地址显然是不可能的。所以浏览器会拿到我们的域名然后通过我们设备内置的dns处理模块去附近最近的dns服务器去查找该域名对应的ip地址,如果找不到,再去其他的dns服务器查找,最终将查找到的ip地址放到我们的请求头部,而不是我们的域名。

(ping www.baidu.com)该指令可用来查看域名的ip

域名查找的过程,主要是根据域名的分级,一级一级的去找,这就是域名分级的作用。下面给一张dns解析的过程图

clipboard.png

TCP连接

客户端(浏览器)通过TCP传输协议建立到服务器的TCP连接 ,该过程称为三次握手,过程如下。

clipboard.png

  1. 先Client端发送连接、请求报文。让服务器知道我要发起连接
  2. Server端接受连接后回复ACK报文,并为这次连接分配资源。表示服务器知道你要发送数据,并且准备好接收数据
  3. Client端接收到ACK报文后也向Server端发送ACK报文,并分配资源,这样TCP连接就建立了。可以开始发送数据

发送数据

客户端(浏览器)向web服务器端(HTTP服务器)发送HTTP协议包,请求服务器里的资源文档 (telnet 模拟)

接收数据

服务器向客户端发送HTTP协议应答包

断开连接

等到数据发送完毕,客户端就会主动发起断开连接,这个过程叫做四次挥手,过程如下

clipboard.png

  1. Client端发起中断连接请求,也就是发送FIN(结束)报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭(Socket),可以继续发送数据。
  2. server发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续等我的消息"。
    wait:这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
  3. 当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。
  4. Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

TCP、UDP、http、https是什么

面向连接的TCP

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。

面向非连接的UDP协议

“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。与手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!

应用层协议http https

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
我们传输数据时使用的就是这些协议

http请求与响应报文

请求报文

  • 请求行

    • 格式: 请求方法(GET POST DELETE HEAD TRACE OPTION等) 请求资源 (URL) 请求协议版本(HTTP/1.1)
  • 请求头

  • 请求体

    • 这里一般是我们要发送的各种格式的数据,例如表单数据 name=aimee&age=18

响应报文

  • 响应行

    • 响应协议版本号(HTTP/1.1) 响应状态码 (200等) 响应状态文字 (0K等)
  • 响应头
  • 响应主体

    • 后台返回给我们的数据

请求方法 GET POST HEAD

  1. GET 使用URL(?a=xx&b=xx)或Cookie传参,不能将数据放到请求体中去,如果放到请求体当中,数据是发不出去的。而对于POST要将数据放在BODY中。即xhr.send(data)
  2. GET 的URL会有长度上的限制,所以传参上面会有限制,而POST可以传输很多数据,虽然它也有大小限制但是能传输的数据比GET多得多。之所以传输数据都有限制是为了防止恶意攻击,保护服务器的安全性。
  3. POST比GET安全(其实只是对于非专业人士来说而已,打开控制台都一目了然)。
  4. HEAD方法用于获取响应头,不能把数据放到body中,响应中也不会有数据部分,就算服务器端放了。

RickyLong
501 声望27 粉丝

所有事情都有一套底层的方法论,主要找到关键点,然后刻意练习,没有刻意练习,做事情只是低效率的重复