iOS网络协议--HTTP/TCP/IP


一. TCP/IP协议

  1. TCP、IP协议的介绍

    两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样。一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没法沟通。两台电脑之间进行通讯所共同遵守的规则,就是网络协议。

  2. TCP/IP协议的制定

    国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI(开放式系统互联)模型。要制定通讯规则,内容会很多,比如要考虑A电脑如何找到B电脑,A电脑在发送消息给B电脑时是否需要B电脑进行反馈,A电脑传送给B电脑的数据的格式又是怎样的?内容太多太杂。OSI模型制定的七层标准模型是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。虽然国际化组织制定了这样一个网络协议的模型,但是实际上互联网通讯视同的网络协议是TCP/IP网络协议。

    TCP/IP是一个协议族,也是按照层次划分。共四层:应用层,传输层,互连网络层,网络接口层。那么TCP/IP协议和OSI模型有什么区别呢?OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP协议参考了OSI模型,但是并没有严格按照OSI规定的七层去划分,而只是划分了四层,个人决定这样会更简单点,当划分太多层次时,你很难区分某个协议是属于哪个层次的。TCP/IP协议和OSI模型也并不冲突,TCP/IP协议中的应用层协议,就对应于OSI中的应用层,表示层,会话层。就像以前有工业部和信息产业部,现在实行打不制后只有工业和信息化部一个部门,但是这个部门还是要做以前两个部门一样多的事情,本质上没有多大的差别。TCP/IP中有两个重要的协议传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。

    TCP/IP协议分为四个层次,但我们并不需要了解所有层次的协议,我觉得主要关注应用层和传输层的协议就可以了。拿寄送邮件举例,A寄邮件给B,A关心的是用什么格式写什么内容给B(应用层内容),是寄挂号信还是寄平信(传输层内容), 但是A是不会去关注邮件传送过程中采用了那条路线,邮递员是如何把信件递送到B手里的(互连网络层,网络接口层)。

    先说传输层,传输层有多个协议,但最主要的是TCP和UDP协议,两则的区别在于TCP协议需要接收方反馈,UDP协议不需要接收方反馈。TCP就像挂号信,A电脑发信息给B电脑后,需要得到B电脑的反馈,这样A电脑就能知道B电脑是否已经收到信息。UDP就像平信,A电脑发信息给B电脑后,B电脑并不给A电脑反馈,A电脑发送信息出去后并不知道B电脑是否已经收到。因此,TCP传输比UDP传送更可靠,但是TCP传输的效率就不如UDP了。至于,在传送过程中具体选择哪种传送方式,需要具体问题具体分析。在不可靠的网络传送过程中一般选择TCP传送方式。在讲求效率,或者不在乎传送失误的情况下可以选择UDP方式来提高传输速率。

    应用层的协议有很多,每一个协议代表一种类型的服务。HTTP协议,万维网服务。FTP协议,文件传送服务。POP3,邮件服务,SOAP(简单对象访问协议)协议webService服务。

    在理解TCP/IP协议的过程中,我遇到了困惑。

    1. 什么是socket?
    • 以前有听说过socket编程这种说法,也有的说套接字编程。我在搜索关于socket的资料时,发现有的说socket是指一个连接,有的说socket是指一个端点。拿打电话做比喻,A电话机和B电话机正在通话,那么socket是指的是A和B之间的连接线呢,还是指电话机(端点)?
    • 我现在的理解是,socket就是一个连接中的一个端点,一次通讯(连接)a,b端都会有一个socket。一个socket对应一个连接。
    1. SOAP可以使用HTTP协议进行传输吗?
    • 在了解SOAP协议的过程中,看到介绍说SOAP可以通过TCP,UDP,HTTP协议来传送。这也是让人困惑的描述。一看这句话,就会感觉HTTP怎么和TCP,UDP协议并列了呢?难道HTTP还是属于传输层协议?再加上HTTP中文译名的问题,名字听上去像传输层,初学者又要开始头大了。
    • 事实上,HTTP是应用层的协议,这一点可以毫无怀疑,那么现在新问题来了,SOAP和HTTP都是应用层协议,怎么说SOAP能用HTTP协议来传输呢?应用层的协议可以用应用层的协议传送吗?
    • 我查阅了资料,是这样一回事,SOAP将信息进行XML(Extensive Markup Language可扩展标示语言)序列化后,再用HTTP协议的方式再打包进行传送,传送的方式还是TCP或者UDP,做个比喻就好理解了。TCP和UDP都是公路,暂且把TCP认为是一般公路,UDP是高速公路,SOAP和HTTP就都是汽车,那么SOAP和HTTP都可以在TCP和UDP上跑。说SOAP可以通过HTTP来传送,实际就是说SOAP是小轿车,HTTP是装轿车的卡车,把SOAP的信息装到HTTP里面,然后再运输,当然走的道路还是TCP或UDP。
    • 说SOAP可以通过HTTP协议来传输,这句话不太准确,比较准确的说法是:SOAP信息可以使用HTTP协议包装后通过TCP或UDP传输。

二、HTTP协议

HTTP (全称:Hyper Text Transport Protocol) 超文本传输协议,是一种应用层的协议;Transport有运输,转移之意。不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议。

  1. URL

    1. 基本介绍

      URL的全称是Uniform Resource Locator (统一资源定位符)

    通过1个URL,能找到互联网上唯一的一个资源,也就是一个资源对应唯一一个URL。

     URL的基本格式 = 协议://主机地址/路径。
     http://www.cnblogs.com/songlei0601/articles/5959241.html
     http://101.169.1.1/songlei/sl.gif
     协议:不同的协议,代表着不同的资源查找方式、资源传输方式
     主机地址:存放资源的主机的IP地址(域名)
     路径:资源在主机中的具体位置
    
    1. URL中常见的协议
      1. HTTP 超文本传输协议,访问的是远程的网络资源,格式是http://
      2. file 访问的是本地计算机上的资源,格式是file://(不用加主机地址)
      3. mailto 访问的是电子邮件地址,地址是mailto:
      4. FTP 访问的是共享主机的文件资源,格式是ftp://
  2. HTTP协议简介

    1. HTTP协议的作用
      1. 规定客户端和服务器之间的数据传输格式

      2. 让客户端和服务器能有效地进行数据沟通

         1、 ---------请求
         客户端 ----HTTP协议----> 服务器
         
         2、 ---------响应
         客户端 <----HTTP协议---- 服务器
        
      3. 为什么选择使用HTTP?

        1. 简单快速。 因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
        2. 灵活。 HTTP允许传输任意类型的数据
        3. HTTP 0.9和1.0使用非持续连接,限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间。
      4. HTTP向服务器索取数据的过程

        1. 请求:客户端向服务器索要数据
        2. 响应:服务器返回客户端相应的数据

三、HTTP通信过程 - 请求和响应

  1. HTTP通信过程 - 请求

    HTTP协议规定:一个完整的由客户端发给服务器的HTTP请求中包含以下内容:

    • 请求行:包含了请求方法、请求资源路径、HTTP协议版本

    GET /Users/songleiMac/Downloads/sl.jpg HTTP/1.1

    • 请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息

    Host: 192.168.1.105:8080// 客户端想访问的服务器主机地址

    User-Agent: Mozilla/5.0(Macintosh; Intel Mac OS X 10.12) Firefox/30.0//客户端的类型,客户端的软件环境

    Accept:text/html, */*// 客户端能接受的数据类型

    Accept-Language:zh-cn// 客户端的语言环境

    Accept-Encoding:gzip//客户端支持的数据压缩格式

  • 请求体:客户端发给服务器的具体数据,比如文件数据。
  1. HTTP通信过程-响应

    客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端

    HTTP协议规定:1个完整的HTTP响应中包含以下内容:

    • 状态行:包含了HTTP协议版本、状态码、状态英文名称

    HTTP/1.1 200 OK

    • 响应头:包含了对服务器的描述、对返回数据的描述

    Server: Apache-Coyote/1.1//服务器的类型

    Content-Type:image/jpeg//返回数据的类型

    Content-Length: 56800//返回数据的长度

    Date: wed. 9 Nov 2016 16:23:52 GMT //响应的时间

    • 实体内容:服务器返回给客户端的具体数据,比如文件数据

      客户端------请求行、请求头、请求体------>服务器
      客户端<------响应行、响应头、实体内容------服务器

  2. 补充

    推荐工具:Firebug

    虫子的作用:拦截所有的http请求。

  3. 常见的响应状态吗

    • 状态码----英文名称----中文描述
    1. 200----OK----请求成功
    2. 400----Bad Request----客户端请求的语法错误,服务器无法解析
    3. 404----Not Found----服务器无法根据客户端的请求找到资源
    4. 500----Internal Server Error----服务器内部错误,无法完成请求

四、发送HTTP请求的方法

  1. 简单说明

    在HTTP/1.1协议中,定义了8种发送HTTP请求的方法:

    GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH

    根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式。PUT:增、DELETE:删、POST:改、GET:查。

    提示:最常用的是GET和POST(实际上GET和POST都能办到增删该查)

  2. get和post请求

    要想使用GET和POST请求跟服务器进行交互,得先了解一个概念:参数就是传递给服务器的具体数据,比如登录时的账号、密码

    GET和POST对比:GET和POST的主要区别表现在数据传递上

    GET

    在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
    http://www.test.com/login?username=123&pwd=123&type=JSON

    注意:由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB

    POST

    发给服务器的参数全部放在请求体中

    理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)

  3. GET和POST的选择

    选择GET和POST的建议:

    1. 如果要传递大量数据,比如文件上传,只能用POST请求
    2. GET的安全性比POST要差些,如果包含机密、敏感信息,建议用POST
    3. 如果仅仅是索取数据(数据查询),建议使用GET
    4. 如果是增加、修改、删除数据,建议使用POST
  4. iOS中发送HTTP请求的方案

    在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有:

    1. 苹果原生(自带):

      NSURLConnection: 用法简单,最古老最经典最直接的一种方案

      NSURLSession: iOS 7 新出的技术,功能比NSURLConnection更加强大

      CFNetWork: NSURL 的底层,纯C语言

    2. 第三方框架:

      ASIHttpRequest: 外号“HTTP终结者”,功能极其强大,可惜早已停止更新。

      AFNetworking: 简单易用,提供了基本够用的常用功能。

  5. ASI和AFN架构对比:

    image

    说明:AFN基于NSURL, ASI基于CFHTTP, ASI的性能更好一些。