iOS之网络相关面试题

一、什么是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文本

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容