2019-07-28 10:45:12 weixin_41718056 阅读数 19
  • Python网络爬虫基础篇

    本课程主要给大家分享基于Python语言的网络爬虫基础篇体验,其中讲解爬虫原理介绍,urllib和requests爬虫库的使用,以及网络爬虫中的数据分析与信息提取。通过模拟Web的GET和POST请求来爬取数据,介绍如何应对各种常见反爬机制。后续还会有更深入的网络爬虫介绍体验,请大家持续关注。

    8373 人正在学习 去看看 CSDN讲师

GET:请求获取URL标识的资源
POST:在URL标识的资源后附加资源

GET POST
后退按钮/刷新 无害 数据会被重新提交
缓存 能被缓存 不能缓存
是否保留在浏览历史 参数保留在浏览器历史中 参数不会保存在浏览器历史中
编码方式 只能进行url编码 支持多种编码方式
传参方式 get参数通过url传递 post放在request body中
对数据长度的限制 发送数据,GET 方法向 URL 添加数据,但URL的长度是受限制的 无限制
对数据类型的限制 只允许 ASCII 字符 没有限制,也允许二进制数据
安全性 安全性较差,因为参数直接暴露在url中 安全性较好,因为参数不会被保存在浏览器历史或 web 服务器日志中
可见性 数据在 URL 中对所有人都是可见的 数据不会显示在 URL 中
2019-09-28 21:01:07 qq_37808895 阅读数 173
  • Python网络爬虫基础篇

    本课程主要给大家分享基于Python语言的网络爬虫基础篇体验,其中讲解爬虫原理介绍,urllib和requests爬虫库的使用,以及网络爬虫中的数据分析与信息提取。通过模拟Web的GET和POST请求来爬取数据,介绍如何应对各种常见反爬机制。后续还会有更深入的网络爬虫介绍体验,请大家持续关注。

    8373 人正在学习 去看看 CSDN讲师

计算机网络

网络模型

OSI七层模型 介绍 主要设备 TCP/IP四层模型 协议
应用层 各种应用程序,网关在应用层,可连接不同协议的子网 应用网关 应用层 DNS(域名解析53),FTP(文件传输协议20,21),TeInet(远程登录协议23),HTTP(超文本传输协议80),SMTP(简单邮件协议),HTTPS(超文本传输安全协议)
表示层 对数据进行加密解密,编码解码,压缩解压缩
会话层 建立不同机器之间的连接
传输层(segment) 实现端对端的通讯传输 传输层 TCP,UDP
网络层(packet) 主机之间通讯,传输IP数据包(IP寻址路由转发数据包packet) 路由器(可以隔离广播风暴而交换机不能)防火墙VPN 网络层 IP(Internet Protocol)网际协议,ARP(地址解析协议),ICMP(网络控制报文协议),IGMP(网际组管理协议)
数据链路层(Frame) 将比特封装成帧,在以太网传输,可实现差错控制 网桥(连接不同网络的桥梁) 交换机(根据数据帧的***MAC地址***交换信息到不同端口)
物理层(Bits) 实现主机与网络之间的物理连接,规定一些传输媒体接口 网线光纤中继器(放大信号等)和集线器(将网线集在一起,多端口的中继器) 主机-网络层 以太网

HTTP和HTTPS

HTTP 端口号80 信息明文传输 连接简单,无状态
HTTPS 端口号443 具有安全性的SSL加密协议 HTTPS协议是由SSL+HTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。 HttpsURLConnection

TCP和UDP

TCP和UDP java.net.
TCP 面向连接可靠字节流传输协议 传输数据之前在不同主机的端口之间建立一条链路,传输前建立连接传输和释放连接。要求系统资源较多 保证数据正确性和顺序 ServerSocket 电话通话
UDP 面向无连接不可靠报文传输协议 数据传输速度快,每个数据包限制在64k以内 可能丢包,不保证数据顺序 DatagramSocket/Packet 视频聊天,对讲机

三次握手

第一次握手 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)。 客户端进入同步发送状态
第二次握手 服务器收到syn包,必须确认客户的ACK(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; ACK:确定号是否有效,一般置为1 服务端进入同步接收状态
第三次握手 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 同时进入建立状态

四次挥手

第一次挥手 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 客户端进入终止等待1状态
第二次挥手 服务器收到FIN连接释放报文,发出ACK确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。 服务端进入关闭等待状态
第三次挥手 客户端收到服务器的ACK确认请求报文后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据) 客户端今日终止等待2状态
第四次挥手 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。 服务端进入最后确认状态
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。 客户端进入时间等待状态
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCP后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。 服务端进入关闭状态,客户端进入关闭状态
服务端状态 CLOSED LISTEN SYN_RCVD ESTABLISHED CLOSE_WAIT LAST_ACK CLOSED
客户端状态 CLOSED SYN_SENT ESTABLISHED FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT CLOSED

为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

IP

IP地址由网络号主机号组成,通过子网掩码可以知道一个IP地址的网络号和主机号

网络号划分子网,子网地址基于没类网络地址的主机部分创建

特征 网络范围 默认掩码
A类地址 第1个8位中的第1位始终为0 0-127.x.x.x 255.0.0.0/8
B类地址 第1个8位中的第1、2位始终为10 128-191.x.x.x 255.255.0.0/16
C类地址 第1个8位中的第1、2、3位始终为110 192-y.x.x.x 255.255.255.0/24

子网掩码

指明一个IP地址的哪些标识是主机所在子网,以及主机的位掩码。

作用:将IP地址划分为网络地址和主机地址两部分

格式ip/子网掩码1的个数,如206.110.4.0/18 ,网络号位为18,子网掩码255.255.192.0,

网络地址

IP地址和子网掩码进行&运算,结果就是网络地址

广播地址

网络地址的主机位全部变成1

例:

IP:141.14.72.24 子网掩码:255.255.192.0 求网络地址

141.14.72.24(72==>01001000)

&

11111111 1111111 11000000 00000000(网络号18位,主机号14位)

=

141.14.64(01000000).0(网络地址)

141.14.126(011111110).127(广播地址)

主机数

子网数=2^子网号位数

每个子网容纳主机数=2^主机位数 - 2

每个子网的主机数量为n,分配的子网地址空间个数为:n+3

加的第一个1是指这个网络连接时所需的网关地址,接着的两个1分别是指网络地址和广播地址

例:一个子网有10台主机,那么对于这个子网需要的IP地址是

13<16=2^4,主机号位为4,子网掩码为255-16=240 255.255.255.240

例:一个子网有14台主机,14+3=17>16,主机号位为5,子网掩码 255.255.224

例:206.110.4.0/18被划分成16个子网求每个子网容纳主机数

默认没有划分子网情况下是C类IP,默认子网掩码是255.255.255.0,网络号为24位,主机号位为8位

划分子网后,子网掩码为255.255.192.0,网络号为18位,主机号为14位,借走了6位主机位,分出26子网数,即每个子网号位数为6,子网数为64(26),每个子网容纳主机数=2^14 - 2

如将206.110.4.0/18划分成16个子网说明子网号位为4(2^4 = 16),原主机号为14位,从主机号中借走4位划分14-4=10,子网的主机号为10位,每个子网容纳主机数=2^主机位数 - 2=1022。

IP地址和MAC地址

IP地址 MAC地址
长度不同 32位二进制 48位二进制
分配依据 网络拓扑 基于制造商
寻址协议不同 网络层 数据链路层
作用 IP寻址路由转发包 数据链路层设备如交换机,根据MAC地址将数据帧从一个节点传送到另一个节点

IP和MAC地址映射关系有ARP地址解析协议完成。ARP根据目的IP地址,找到中建节点的MAC地址,通过其传送最终达到目的网络

Websocket

websocket是基于HTTP的应用层协议,只需要完成一次握手,建立长连接并进行双向传输,,不需要再次发起网络请求,允许服务端向客户端推送信息(Http是通过客户端Ajax轮询发起请求,服务端进行响应),是双向通信协议。使用ws(80)或wss(443)的统一资源标识符(wss表示在TLS上的websocket)

websocket在建立握手时通过 HTTP/1.1 协议的101状态码进行握手。但是建立之后,在真正传输时候是不需要HTTP协议的,而是使用TCP协议。

HTTP协议版本和报文

属于OSI应用层协议,由请求和响应构成。无状态协议。

建立TCP连接后,通过socket访问连接,客户端通过该连接发送HTTP请求报文(ASCII码)

请求报文

请求行:方法字段 URL字段 HTTP协议版本

请求头:键值对格式,浏览器自行封装,要告知服务器的一些信息

空行

请求体:请求参数(get为空)

在这里插入图片描述

响应报文

状态:HTTP协议版本 状态码 状态码的原因短码

响应头:键值对格式,浏览器自行封装,要告知服务器的一些信息

空行

响应体:静态资源

在这里插入图片描述

HTTP版本

HTTP1 HTTP1.1 HTTP2.0
当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接 默认使用长连接,减少三次握手开销 使用多路复用技术,通过单一的HTTP/2连接发起多重请求响应信息
只发送header信息,如判断有权限请求返回100,客户端接收后再发送body。返回401不发送。 采用二进制格式
当浏览器下次请求的时候又要建立连接 支持断点续传 多路复用底层采用“二进制分帧层”的方法,分割成更小的帧,二进制进行编码,多个请求在一个TCP连接上完成,性能提升
同一时间见对同一域名请求数量有限制,超过阻塞
短连接:在HTTP1.0中,客户端发送请求,服务器接收请求,双方建立连接,服务器响应资源,请求结束。

长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务端没有返回之前保持连接,当客户端再发送请求时,它会使用同一个连接。这一直继续到客户端或服务器端认为会话已经结束,其中一方中断连接。

   优势:减少了连接请求,降低TCP阻塞,减少了延迟,实时性较好。

   劣势:可能会影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。

状态码

状态字 含义
1** 表示通知信息,表示请求收到,或者正在处理 100 Continue客户端应当继续发送请求 101 Switching Protocols服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求
2** 成功,操作被成功接收并处理 200 OK请求已成功 204:请求被受理但没有资源可以返回
3** 重定向 301 Moved Permanently永久性重定向 302临时重定向,请求的资源已经临时移动到新URL 303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
4** 客户端错误 401请求需要认证 403请求的对应资源禁止被访问 404服务器无法根据客户的请求找到资源
5** 服务器错误 500服务器内部错误,无法完成请求 503服务器正忙

请求方法

请求方法
GET 请求获取由Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
OPTIONS 请求查询服务器的性能,返回服务器所支持的请求方法
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除由Request-URI所标识的资源
TRACE 回显请求服务器收到的请求信息,主要用语测试或诊断

GET和POST的区别

都是HTTP协议中的两种请求方式,HTTP是基于TCP/IP的应用层协议,在报文格式上,请求行不同

GET POST
带参数时 GET方法的参数放在URL中 POST方法放在请求体中
GET通过URL提交数据,约定是参数写在?后以&分割,因此GET提交的数据量和URL所能达到的最大长度有关
实际上HTTP协议对URL长度没有限制,限制URL长度大多是浏览器或服务器配置参数
GET方式通过URL方式请求,明文传输,数据地址栏可见 POST传输数据地址栏不可见
回退 无害 重新被提交
可悲缓存 不可被缓存
2018-06-29 18:21:34 N1neDing 阅读数 1021
  • Python网络爬虫基础篇

    本课程主要给大家分享基于Python语言的网络爬虫基础篇体验,其中讲解爬虫原理介绍,urllib和requests爬虫库的使用,以及网络爬虫中的数据分析与信息提取。通过模拟Web的GET和POST请求来爬取数据,介绍如何应对各种常见反爬机制。后续还会有更深入的网络爬虫介绍体验,请大家持续关注。

    8373 人正在学习 去看看 CSDN讲师

涉及到是否有抓包经历。GET和POST是我们常用的两种HTTP方法,可以使用wireshark抓取HTTP的get和post请求。

GET和POST格式是怎样的?

一个HTTP请求报文分为四部分:请求行,请求头,空行,请求数据(body主体):

1.请求行:由请求方法字段、URL字段、和HTTP协议版本字段3个字段组成,如:POST http://127.0.0.1:8001/ HTTP/1.1\r\n (其中\r\n代表换行)

2.请求头:从第二行开始,以(key-value)对组成,以\r\n换行符结尾,每一行的内容都是一个请求头参数值,直到遇到一个空行为止,典型的请求头有:

 

  • User-Agent:产生请求的浏览器类型。
  • Accept:客户端可识别的内容类型列表。
  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机

3.空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。在实际抓包中就是(\r\n),即请求头和请求体中间隔着一行空行作为分界

4.请求数据(body 主体):请求数据不在GET方法中使用,而是在POST方法中使用,即GET方式的请求没有请求数据,是将参数追加到URL后面的,URL中?后面的内容为请求参数,而POST则四个部分都有POST 方法适用于需要客户填写表单的场合,与请求数据相关的最常使用的请求头是Content-Type 和 Content-Length,用于指定请求数据的类型和长度。

(在wireshark中使用 http.request.method=="GET" 命令可进行查询过滤)

注:因为get请求参数一般都用ascii编码到url中,所以不含请求数据(request-body),当然你也可以强行放到request-body里面。

GET和POST的区别:

GET和POST最主要的区别是:GET用于请求获取数据,而POST是向指定的资源创建修改数据。最直观的区别是GET把参数包含在URL中,POST通过请求体传递参数,所以POST更安全。而且GET的url长度是有限制的(2048个字符),POST无限制。

总结如下:

 

  1. GET在浏览器回退时是无害的,POST会再次提交请求
  2. GET产生的URL地址可以被Bookmark,而POST不可以
  3. GET请求会被浏览器主动cache,而POST不会,除非手动设置
  4. GET请求只能进行url编码,而POST支持多种编码方式
  5. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
  6. GET请求在URL中传送的参数是有长度限制的,而POST没有
  7. 对参数的数据类型,GET只接受ASCII码,而POST没有限制
  8. GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息,如密码
  9. GET参数通过URL传递,POST放在request body中

以上都是表面上的区别,如果往深层次思考,GET和POST都是HTTP协议中的两种发送请求的方法,而HTTP是基于TCP/IP的关于数据如何在万维网中能够通信的协议,即底层是TCP/IP,所以GET和POST的底层也是TCP/IP,也就是说GET/POST都是TCP连接,GET和POST所做的事是一样的,如果要给GET加上request body,给POST加上URL参数,技术上是完全行得通的。只是HTTP的规定对GET和POST加上的“行为准则”:“GET将需要传送的数据放在url中,POST将参数放在请求体中”。而TCP才是GET和POST怎么实现的基本,他们本质上都是TCP连接。如果使用GET服务,在request body偷偷藏了数据,不同的处理器处理方式不同,有的会读取数据,有的服务器会直接忽略,即不一定能被接收到。

至于GET传送参数有长度限制,是因为业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url,超过的部分不会处理。

另一个很重要的区别是:GET产生一个TCP数据包,POST产生两个TCP数据包。即:GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器在发送data,服务器响应200(返回数据)。因为POST需要两步,时间上消耗的要多一点,所以GET比POST效率要高。但是在网络环境差的情况下,两次包的TCP在验证数据包完整性上,更具有优势。

参考自:点击打开链接  点击打开链接

2019-06-14 11:50:48 weixin_41910694 阅读数 2131
  • Python网络爬虫基础篇

    本课程主要给大家分享基于Python语言的网络爬虫基础篇体验,其中讲解爬虫原理介绍,urllib和requests爬虫库的使用,以及网络爬虫中的数据分析与信息提取。通过模拟Web的GET和POST请求来爬取数据,介绍如何应对各种常见反爬机制。后续还会有更深入的网络爬虫介绍体验,请大家持续关注。

    8373 人正在学习 去看看 CSDN讲师

计算机网络面试问题


目录

  1. OSI七层模型与TCP/IP五层模型
  2. 三次握手
  3. 四次挥手
  4. Http和Https的区别
  5. 对称加密与非对称加密
  6. TCP与UDP的区别
  7. 从输入网址到获得页面的过程
  8. 常见状态码及原因短语
  9. Get与POST的区别
  10. DNS的寻址过程
  11. 其他常见问题

注:在牛客上复习java摘录的,还有其他博客,便于自己复习,侵删。
链接:

  1. https://www.nowcoder.com/tutorial/94/a9220944ad014f55be4015c19247af91
  2. https://blog.csdn.net/qq_39322743/article/details/79700863

1. OSI七层模型与TCP/IP五层模型

在这里插入图片描述


2. 三次握手

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:在这里插入图片描述

  1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。


3. 四次挥手

四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:在这里插入图片描述
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。

  1. 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

  2. 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

  3. 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

  4. 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。


4. Http和Https的区别

  1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。


5. 对称加密与非对称加密

  1. 对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

  2. 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。


6. TCP与UDP的区别

  1. TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议,它们之间的区别包括:

  2. TCP是面向连接的,UDP是无连接的;

  3. TCP是可靠的,UDP是不可靠的;

  4. TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;

  5. TCP是面向字节流的,UDP是面向报文的;

  6. TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;

  7. TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;


7. 从输入网址到获得页面的过程

  1. 浏览器查询 DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;

  2. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;

  3. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;

  4. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;

  5. 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;

  6. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。


8. 常见状态码及原因短语

1×× : 请求处理中,请求已被接受,正在处理

2×× : 请求成功,请求被成功处理
200 OK

3×× : 重定向,要完成请求必须进行进一步处理
301 : 永久性转移
302 :暂时性转移
304 : 已缓存

4×× : 客户端错误,请求不合法
400:Bad Request,请求有语法问题
403:拒绝请求
404:客户端所访问的页面不存在

5×× : 服务器端错误,服务器不能处理合法请求
500 :服务器内部错误
503 : 服务不可用,稍等

具体参考菜鸟教程:https://www.runoob.com/http/http-status-codes.html


9. Get与POST的区别

  1. 从功能上讲,GET一般用来从服务器上获取资源,POST一般用来更新服务器上的资源;

  2. 从REST服务角度上说,GET是幂等的,即读取同一个资源,总是得到相同的数据,而POST不是幂等的,因为每次请求对资源的改变并不是相同的;进一步地,GET不会改变服务器上的资源,而POST会对服务器资源进行改变;

  3. 从请求参数形式上看,GET请求的数据会附在URL之后,即将请求数据放置在HTTP报文的 请求头 中,以?分割URL和传输数据,参数之间以&相连。特别地,如果数据是英文字母/数字,原样发送;否则,会将其编码为 application/x-www-form-urlencoded MIME 字符串(如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII);而POST请求会把提交的数据则放置在是HTTP请求报文的 请求体 中。

  4. 就安全性而言,POST的安全性要比GET的安全性高,因为GET请求提交的数据将明文出现在URL上,而且POST请求参数则被包装到请求体中,相对更安全。

  5. 从请求的大小看,GET请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的。


10. DNS的寻址过程

  1. 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

  2. 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

  3. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

  4. 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。

  6. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。


11. 其他常见问题

  1. 谈一下,为什么tcp为什么要建立连接?
    保证可靠传输。

  2. 请你解释一下TCP为什么可靠一些
    三次握手,超时重传,滑动窗口,拥塞控制。

  3. 请说明一下哪种应用场景会使用TCP协议,使用它的意义
    当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议

  4. 请简单解释一下,arp协议和arp攻击。
    地址解析协议。ARP攻击的第一步就是ARP欺骗。由上述“ARP协议的工作过程”我们知道,ARP协议基本没有对网络的安全性做任何思考,当时人们考虑的重点是如何保证网络通信能够正确和快速的完成——ARP协议工作的前提是默认了其所在的网络是一个善良的网络,每台主机在向网络中发送应答信号时都是使用的真实身份。不过后来,人们发现ARP应答中的IP地址和MAC地址中的信息是可以伪造的,并不一定是自己的真实IP地址和MAC地址,由此,ARP欺骗就产生了。

  5. 什么是icmp协议,它的作用是什么?
    它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

2019-08-28 18:40:26 ly_6699 阅读数 56
  • Python网络爬虫基础篇

    本课程主要给大家分享基于Python语言的网络爬虫基础篇体验,其中讲解爬虫原理介绍,urllib和requests爬虫库的使用,以及网络爬虫中的数据分析与信息提取。通过模拟Web的GET和POST请求来爬取数据,介绍如何应对各种常见反爬机制。后续还会有更深入的网络爬虫介绍体验,请大家持续关注。

    8373 人正在学习 去看看 CSDN讲师

我在前面博客:详解HTTP协议中讲到HTTP协议的一些方法,但是被面试官问到最多的是get和post方法的区别,虽然很多人都知道,但是并不能让面试官满意,所以我在这里就重点比较获取数据的三种方法:GET,POST,PUT方法的区别

1. get 和 post 方法比较

get和post方法主要有以下五点区别:

  1. 安全性:post方法更安全
  2. 传输资源的大小:post能传输的资源更大
  3. 传输资源的数据类型:post能传输的数据类型更多
  4. 应用场景:post用于写入和修改数据,get用于搜索和查询
  5. 获取资源的速度:get更快!! 面试官心里最想让你说的一点

下面,我就针对上面分析到的五点,依次介绍一下:

post 方法获取资源更安全

GET方法是使用URL传参的,而POST方法是在报文主体中传参,这也就意味着POST在传参时更安全。如下图所示,用GET方法请求时,用户的私人信息会暴露在URL中, 这存在很大隐患。
在这里插入图片描述
这里需要注意一点,直接使用HTTP协议发送的数据,是没有经过加密的,也就是说只要是有人想截取到报文,无论get还是post方法并没有区别,所以在HTTP协议中我们应该说post方法更私密,因为它将参数 “ 藏 ” 的更深。

post 方法能传输的资源更大

由于传参的方式不同导致传输资源的大小也不同。get方法请求时由于浏览器对地址长度的限制而导致传输的数据有限制,而post方法在报文中就不会有这个问题。
这里对于地址长度的限制要声明一点,http协议并未规定get和post的长度限制,get的最大长度限制是因为浏览器和web服务器限制了URL的长度,不同的浏览器对地址长度的限制也是不同的。要强调的是,这个长度的限制不是对于参数长度的限制,而是对于整个URL的长度。
下面是常见的web浏览器和服务器对于get最大传参长度限制:

  • IE浏览器:对url长度限制是2083(2K+53),超过这个限制,则自动截断
  • firefox:firefox(火狐浏览器)的url长度限制为 65536字符,但实际上有效的URL最大长度不少于100,000个字符
  • chrome(谷歌)的url长度限制超过8182个字符返回错误
  • Apache服务器:Apache能接受url长度限制为8192 字符

post 方法能传输的数据类型更多

GET方法只能传输ASCII码值(0-127),而POST可以传输任意数据类型

应用场景不同

post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据。

get 方法获取资源更快,原因有以下四点:

  • post请求时包含了更多的请求头,这是必然的,因为post请求在body中
  • 最重要的一点:post在真正接收数据前会先将请求头发送给服务器进行确认,收到服务器回复100的确认码后,才开始发送正文;但是get会在第三次握手时就交付数据。
    并有网友测试过:get的总耗是post的2/3左右
post请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回100 Continue响应
(5)浏览器发送数据
(6)服务器返回200 OK响应

get请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回200 OK响应
  • get会将请求过的数据缓存起来,而post不会
    所以对于同一个资源请求多次时,get方法只有在第一次的时候和post时间相同,之后的话get方法会直接从缓存区中获取,而post方法必须再次发起完整请求。
  • post不能进行管道化传输
    这种技术是基于HTTP长连接的技术,他是为了提高效率而出现的。本来对于客户端来说只有收到了上一个请求的回应才能发送下一个请求,但是对于一张需要请求多次的网页来说这种方式未免效率太低。所以此技术是把需要发送到服务器上的所有请求放到输出队列中,在第一个请求发送出去后,不等到收到服务器的应答,第二个请求紧接着就发送出去。这种技术有点像连续的ARQ协议,但是这种技术存在缺陷,如果一个管道中有10个连接,在发送出9个后,突然服务器告诉你,连接关闭了,此时客户端即使收到了前9个请求的答复,也会将这9个请求的内容清空,也就是说,白忙活了……此时,客户端的这9个请求需要重新发送。这对于非幂等性的POST来说存在非常大的问题,重新发送请求你就不能保证状态会发生什么样的变化,尤其是在支付时。所以一般的浏览器都不会对POST方法使用管线化技术,也就意味着请求速度绝比不上GET方法。

2. post和put比较
首先了解一下幂等性:幂等性可以简单的理解为同一操作执行一次,以及后续的多次执行,对系统状态的影响是一致的。
而对于上述我们所讲的方法中,GET,PUT,DELETE都是幂等操作,而POST不是。PUT请求的幂等性可以这样理解,将A修改为B,它第一次请求值变为了B,再进行多次此操作,最终的结果还是B,与一次执行的结果是一样的,所以PUT是幂等操作。 POST不是幂等操作,因为一次请求添加一份新资源,二次请求则添加了两份新资源,多次请求会产生不同的结果,因此POST不是幂等操作。

这里举个简单的例子,如果你在CSDN下发布一篇博客,使用PUT方法不管在发布时请求多少次最后都只产生一篇博客,而如果使用POST方法则可能会产生多篇相同的博客,相信不难理解,所以这也就是为什么上一小节中POST通常不会使用管线化技术的原因

对于三种方法的理解,我已经全部交出来了,有其他理解的可以留言区讨论~

计算机网络

阅读数 4

没有更多推荐了,返回首页