美文网首页
iOS之网络相关面试题

iOS之网络相关面试题

作者: 枫叶无处漂泊 | 来源:发表于2021-04-06 01:09 被阅读0次

    一、什么是http?

    http协议(超文本传输协议)

    是一种详细规定了浏览器和万维网(WWW = World Wide Web )服务器之间相互通信的原则,通过因特网传送万维网文档的数据传送协议。

    二、http是基于TCP还是UDP?

    HTTP是基于TCP的应用层协议

    三、HTTP的特点

    • 无连接、 无状态
    • HTTP的持久连接、Cookie/Session

    1.HTTP的无状态

    每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求时无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况。

    也就是说服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
    标准的HTTP协议指的是不包括cookies,session,application的HTTP协议

    1.HTTP的持久连接

    • 非持久连接:每个连接处理一个请求-响应事务。
    • 持久连接:每个连接可以处理多个请求-响应事务。

    持久连接情况下,服务器发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。
    HTTP/1.0使用非持久连接。HTTP/1.1 默认使用持久连接<keep-alive>。

    非持久连接的每个连接,TCP得在客户端和服务端分配TCP缓冲区,并维持TCP变量,会严重增加服务器负担。而且每个对象都有2个RTT(Round Trip Time,也就是一个数据包从发出去到回来的时间)的延迟,由于TCP的拥塞控制方案,每个对象都遭受TCP缓启动,因为每个TCP连接都起始于缓启动阶段

    3.HTTP持久连接怎么判断一个请求是否结束的?

    有两种方法可以判断:

    1. Content-length:根据所接收字节数是否达到Content-length值

    2. chunked(分块传输):Transfer-Encoding。当选择分块传输时,响应头中可以不包含Content-Length,服务器会先回复一个不带数据的报文(只有响应行和响应头和\r\n),然后开始传输若干个数据块。当传输完若干个数据块后,需要再传输一个空的数据块,当客户端收到空的数据块时,则客户端知道数据接收完毕。

    四、OSI网络的七层协议?

    从下到上分别是:

    • 物理层
    • 数据链路层
    • 网络层
    • 传输层
    • 会话层
    • 表示层
    • 应用层

    五、请求报

    1. 请求行
    2. 请求头
    3. 空格
      • 用户进行内容分割,表示请求头到此为止,下一行的内容不再是请求头。
    4. 请求体
      • 请求体包含的就是请求数据,正如上文提高的,当使用的是GET方法的时候,没有请求体。

    如下图是请求报文的结构图:

    请求报文组成图.png

    请求报文

    POST  /somedir/page.html  HTTP/1.1    
    //以上是请求行:方法字段、URL字段和HTTP版本字段
    Host: www.user.com
    Content-Type: application/x-www-form-urlencoded
    Connection: Keep-Alive
    User-agent: Mozilla/5.0.    
    Accept-lauguage: fr  
    //以上是首部行
    (此处必须有一空行)  //空行分割header和请求内容 
    name=world   请求体
    

    一、请求行

    第一行为请求行,由请求方法、URI和HTTP协议版本3个字段组成,它们之间用空格分隔,最后以回车和换行符结尾进行内容分割,表示接下来的内容(下一行开始的)不是请求行的内容例如。举例,GET /index.php HTTP/1.1,GET是请求方法,/index.php是URI,HTTP/1.1表示使用的HTTP版本为1.1。

    1、请求方法

    只有请求方法的类型比较多,有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,其中GET、POST最为常用

    GET和POST区别:

    • 请求参数方式:GET的请求参数一般以?分割拼接到URL后面,POST请求参数在Body里面

    • 请求参数长度:GET参数长度限制为2048个字符,POST一般是没限制的

    • 请求参数存放位置:GET请求由于参数裸露在URL中, 是不安全的,POST请求则是相对安全

    之所以说是相对安全,是因为,如果POST虽然参数非明文,但如果被抓包,GET和POST一样都是不安全的。(HTTPS该用还是得用)

    • 请求资源方面:GET获取资源是 安全的,幂等的(只读的,纯粹的), 可缓存的,POST 获取资源是 非安全的,非幂等的,不可缓存的

    这里的安全是指不应引起Server端的任何状态变化.
    GET的语义就是获取数据,是不会引起服务器的状态变化的,即是安全的。(HEAD,OPTIONS也是安全的),而POST语义则是提交数据,是可能会引起服务器状态变化的,即是不安全的.

    幂等:同一个请求方法执行多次和执行一次的效果完全相同.显然GET请求是幂等而POST请求是非幂等的。

    • 请求是否可缓存:GET请求会主动进行Cache。

    因为GET是幂等的只读的,即GET请求除了返回数据不会有其他副作用,所以GET才是安全的,从而可以直接由CDN缓存,大大减轻服务器的负担,也就是可缓存的。
    而POST是非幂等的,即除了返回数据还会有其他副作用,所以POST是不安全的,必须交由web服务器处理,即是 不可缓存的

    • 在响应时,GET产生一个TCP数据包;POST产生两个TCP数据包。

    对于GET方式的请求,浏览器会把Header和实体主体一并发送出去,服务器响应200(返回数据)

    对于POST,浏览器先发送Header,服务器响应100 Continue,浏览器再发送实体主体,服务器响应200 OK(返回数据)。

    GET 相对 POST 的优势是什么?

    • 最大的优势就是方便。GET 的URL可以直接手输,从而GET请求中的URL可以被存在书签里,或者历史记录里

    • 可以被缓存,大大减轻服务器的负担
      所以大多数情况下,还是用GET比较好。

    二、请求头

    请求头部由键/值对组成,每行一对,键和值用冒号“:”(英文)分隔。请求头部告知服务器所有关于客户端请求的信息,典型的请求头有:

    • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机

    • Content-Type: application/x-www-form-urlencoded 表明 HTTP会将请求参数用key1=val1&key2=val2的方式进行组织,并放到请求实体里面

    • User-agent:产生请求的用户代理信息(浏览器信息)例如: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36等;

    • Accept-lauguage: 表示可接受语言

    • connection:连接方式,有close和keep-alive两种。

      • close:告诉WEB服务器或代理服务器,在完成本次请求的响应后,断开连接

      • keep-alive:告诉WEB服务器或代理服务器。在完成本次请求的响应后,保持连接,以等待后续请求

    六、响应报文

    响应报文也是四部分组成:

    • 状态行、
    • 响应头
    • 空行
    • 响应体
      • 这个是服务器返回给浏览器的响应信息

    状态行之外,其他三个部分与请求报文类似.

    响应报文的结构图如下:

    响应报文组成图.png
    
    HTTP/1.1 200 OK    
    //以上是状态行:协议版本字段、状态码、相应状态信息
    Connection:close
    Server:Apache/2.2.3(CentOS)
    Date: Sat, 31 Dec 2005 23:59:59 GMT
    Content-Type: text/html
    Content-Length: 122
    //以上是首部行
    (此处必须有一空行)  //空行分割header和实体主体
    (data data data data)//响应实体
    
    

    1.状态行

    HTTP/1.1 200 OK : http版本 状态码以及短语提示请求的结果。一下常见的状态码和对应的短语:

    • 1xx:指示信息--表示请求已接收,继续处理。

    • 2xx:成功--表示请求已被成功接收、理解、接受。

    • 3xx:重定向--要完成请求必须进行更进一步的操作。

    • 4xx:客户端错误--请求有语法错误或请求无法实现。

    • 5xx:服务器端错误--服务器未能实现合法的请求。

    常见状态代码、状态描述的说明如下:

    • 200 OK:客户端请求成功

    • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。

    • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。

    • 403 Forbidden:服务器收到请求,但是拒绝提供服务。

    • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL

    • 500 Internal Server Error:服务器发生不可预期的错误。

    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

    2、响应头

    • Connection:

      • close首部行告诉客户,发送完报文后将关闭TCP连接。
      • keep-alive:连接已保持,在等待本次连接的后续请求;
    • Date:指的不是对象创建或最后修改的时间,而是服务器从文件系统中检索到该对象,插入到响应报文,并发送该响应报文的时间

    • Server: 首部行指示该报文是由一台Apache Web服务器产生的,类似于HTTP请求报文里的User-agent

    • Content-Length:首部行指示了被发送对象中的字节数

    • Content-Type:首部行指示了实体中的对象是HTML文本

    相关文章

      网友评论

          本文标题:iOS之网络相关面试题

          本文链接:https://www.haomeiwen.com/subject/oqojkltx.html