首页 > 技术文章 > 开发必须懂的网络常识

xiejw 2016-03-11 00:26 原文

1、网络常用概念

     网络是应用的灵魂,是所有应用的数据来源.离开了网络,我们的应用就是一潭死水,网络是数据交互的媒介,我们通过网络得到服务器上的数据,也是通过网络给服务器传递数据. 也就是说,网络的实质就 是是交互数据,而数据交互的媒介就是在网络中传输二进制数据流(包括html/图片/视频数据)。

      互联网开发的常用概念:

      客户端(Client):移动设备(手机/iPad等手持设备),客户端一般就是前端/前台等等.iOS,android开发都是前端开发.

      服务器(Server):为客户端提供服务(比如数据/资源等)的机器---本质也是一台计算机(+服务器软件),服务器开发就是后端/后台开发.java/php/.net等.

      请求(Request):客户端向服务器索取数据.

      响应(Response):服务器对客户端请求做出的反应,一般就是返回数据给客户端.

      服务器:按开发阶段来分,分为两种:

      远程服务器: 外网服务器.应用上线之后供全体用户使用的服务器.速度取决于用户的网速和服务器的性能.

      本地服务器: 内网服务器,测试服务器.开发测试阶段使用的服务器.供内部开发测试人员使用.速度飞快.

2.什么是IP地址

      静态IP地址:固定不变的IP地址,需要用户自己手动设置.

      动态IP地址:打开计算机后,自动生成的IP地址,不用人为设置。动态的IP地址是通过DHCP协议实现自动获取的。

      子网掩码:与IP地址配合使用判断两台计算机是否位于同一个子网络.

      DNS服务器: 可以将域名(网址)转换成IP地址.

      DHCP协议: 每一个子网络中,有一台计算机负责管理本网络的所有IP地址,它叫做“DHCP服务器”.当新的计算机加入网络,必须向“DHCP服务器”发

送一个“DHCP请求”数据包,申请IP地址和相关的网络参数.然后DHCP协议会赋予本机一些参数,如动态IP地址,子网掩码,网关,DNS服务器等.

以太网标头: 设置发出方(本机)的MAC地址和接收方(DHCP服务器)的MAC地址.
IP标头:设置发出方(本机)的IP地址和接收方(DHCP服务器)的IP地址
UDP标头:设置发出方(本机)的端口和接收方(DHCP服务器)的端口.  这一部分是DHCP协议规定好的,发出方是68端口,接收方是67端口.
     所以电脑想要上网,都需要确定这四个参数:本机IP地址, 子网掩码, 网关的IP地址, DNS的IP地址。

   3.HTTP请求

          通俗地说,网络协议就是网络之间沟通、交流的桥梁,只有相同网络协议的计算机才能进行信息的沟通与交流。这就好比人与人之间交流所使用的各种语言一样,只有使用相同语言才能正常、顺利地进行交流。从专业角度定义,网络协议是计算机在网络中实现通信时必须遵守的约定,也就是通信协议。主要是对信息传输的速率、传输代码、代码结构、传输控制步骤、出错控制等作出规定并制定出标准。

         3.1. URL(Uniform Resource Locator):

         统一资源定位符.URL就是资源的地址,位置.通过一个URL能够找到互联网上唯一的一个资源.

         URL的基本格式:  协议://主机地址/路径

         协议:不同的协议代表不同的资源查找方式,资源传输方式.

        URL中的常见协议:

        <1>HTTP:超文本传输协议,在网络开发中最常用的协议.访问的是远程的网络资源.格式:http://...     

         <2>IP协议:

       TCP数据包嵌入IP数据包.IP数据包标头需要设置双方的IP地址.发送方(本机)是:192.168.2.6 ,接收方(百度)是:119.75.218.70

  IP数据包的标头长度为20字节.加上嵌入的TCP数据包,现在总长度是5000字节        

        <3>file:访问的时本地计算机上的资源.格式:file://(不要再加主机地址了)

        <4>FTP:访问的是共享主机的文件资源.格式:ftp://

        <5> TCP协议:

    TCP数据包标头需要设置端口,接收方(Baidu)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024~65535之间的整数.

    TCP数据包的标头长度是20字节.加上嵌入的HTTP数据包,现在总长度是4980字节.

        <6>以太网协议 

         IP数据包嵌入以太网数据包的数据部分.以太网数据包的标头需要设置双方的MAC地址.发送方为本机的网卡MAC地址,接收方为网关192.168.2.1的MAC地址(通过ARP协议得到), 以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节.因此,IP数据包必须分割成四个包,因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500 ,1500, 1500,560 字节.

        <7>mailto:访问的是电子邮件地址.格式:mailto:     

          主机地址:存放资源的主机IP地址(域名).

          路径:资源在主机中得具体位置.

       3.2. HTTP请求的完整过程: 

    <1> 请求: 客户端发出请求.向服务器索要数据(操作数据).

    <2> 响应: 服务器对客户端的请求做出响应.返回客户端所需要的数据.

       3.3. 包装一个HTTP请求

    用 NSURLRequest 来包装一个HTTP请求.可以指定缓存策略和超时时间,缓存策略的选择:NSURLRequestCachePolicy

        NSURLRequestUseProtocolCachePolicy = 0,

        // 默认的缓存策略,使用协议定义.   

        NSURLRequestReloadIgnoringLocalCacheData = 1,

        // 忽略本地缓存,直接从原始服务器地址下载.  

        NSURLRequestReturnCacheDataElseLoad = 2,

        // 只有在缓存中不存在数据时,才从原始地址下载 

        NSURLRequestReturnCacheDataDontLoad = 3,

        // 只使用缓存数据,如果不存在缓存,则请求失败. 用于没有网络连接的离线模式

        NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,

        // 忽略远程和本地的数据缓存,直接从原始地址下载

        NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData = 1,

        // 忽略缓存,直接从原始服务器地址下载.

        NSURLRequestReloadRevalidatingCacheData = 5,

        // 验证本地数据和远程数据是否相同,如果不同则下载远程数据,否则使用本地数据

             网络缓存数据,保存在SQLite的数据库中(NSHomeDirectory()),    

         3.4. 发送请求

    用 NSURLConnection 发送请求.

    同步方法:

    + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;

    异步方法:

    + (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue

    completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler 

4.Socket介绍

      网络上的两个程序通过一个双向的通信连接实现数据的交换,根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听,继续接收其他客户端套接字的连接请求。

       分步骤创建Socket

        1.创建客户端Socket            socket(<#int#>, <#int#>, <#int#>);

        2.创建服务器Socket            struct sockaddr_in serverAddress;

        3.连接到服务器(Socket编程)     connect(<#int#>, <#const struct sockaddr *#>, <#socklen_t#>);

        4.发送数据给服务器             send(<#int#>, <#const void *#>, <#size_t#>, <#int#>)

        5.接收服务器返回的数据          recv(<#int#>, <#void *#>, <#size_t#>, <#int#>)

        6.关闭 Socket                close(socketNumber)

推荐阅读