在做移动端开发时,感觉iOS对网络层的封装其实已经做到非常便利于开发者使用。不管使用iOS原生做网络请求还是第三方框架里的AFN或ASI,都是基本让开发者不需要理会太多的网络通信的理论性知识。鉴于最近想做OA项目移动端开发,还是好好整理下这方面的理论为接下来的即时通讯做准备。-- linweida
了解一下服务端与移动客户端之间的交互的方式
第一种是基于原生开发的交互过程:
(1)移动客户端通过协议(http、https称为协议)调用API访问接口页面,比如通过url为http://localhost:8080/api/login.sap?name=123&password=123。
(2)编译器通过API命令调用服务器的webservice访问数据库。
(3)服务器的数据库通过数据库语句处理数据并返回结果给webservice。
(4)服务器的webservice把数据库的数据转换为JSON或XML格式的数据文本传给移动客户端。
(3)移动客户端得到数据文本后,经过反序列化后处理内容。
第二种是基于手机浏览器开发的交互过程是:
(1)移动客户端使用浏览器调用服务器的webservice接口访问数据。
(2)服务器的数据库通过数据库语句处理数据并返回结果给webservice。
(3)服务器的webservice把数据库的数据转换为JSON或XML格式的数据文本传给移动客户端。
(4)移动客户端接收到服务器webservice传过来的数据文本后,经过反序列化后处理内容。
为什么有OSI模型?什么是OSI模型?
由于存在众多的网络模型,国际化标准组织设计了OSI模型统一网络连接问题。OSI模型由低到高分别是物理层(Physical Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)和应用层(Application Layer)。
第一层到第三层属于OSI参考模型的低三层,负责创建网络通信连接的链路,也称为媒体层。
第四层到第七层 为OSI参考模型的高四层,具体负责端到端的数据通信,也称为主机层。在客户端开发中也是主要了解这高四层。
网络通信的三个要素是哪些?
第一,IP地址是网络上主机设备的唯一标识。
第二,端口是用于标示进程的逻辑地址,不同进程的标示。有效端口在0~65535,其中保留端口是0~1024。
第三,传输协议是用什么样的方式进行交互,常见协议是TCP或UDP。
第四层,传输层(Transport Layer)
传输层的作用:负责获取全部信息。它必须跟踪数据单元碎片、乱序到达的数据包和其它在传输过程中可能发生的危险。介于低三层和高三层之间的一层,它是源端到目的端对数据传送进行控制从低到高的最后一层。
传输层的协议:TCP(传输控制协议)、UDP(用户数据包协议)等。从低到高往下延伸,TCP/IP协议族包括运输层、网络层、链路层。
传输层区分不同程序的数据流:它只知道目标主机上的哪个服务程序来响应这个程序,而不知道这个服务程序是干什么的。传输层的TCP和UDP可以接收来自多个应用程序的数据流,用端口号标识他们,然后把他们送给Internet层处。同时TCP和UDP接收来自Internet层的数据包,用端口号区分他们,然后交给不同的应用程序。(在同一IP地址(同一个目标主机)上不同的端口号是两个不同的链接。IP地址和端口号用来唯一的确定网络上数据的目的地。)
TCP(传输控制协议):
(1)需要经过三次握手才能完成通信的协议,所以它是可靠的面向链接的协议。
(2)前期在三次握手时会耗费时间,后期数据传递时还需要确认机制、重传机制、拥塞控制机制等。并且每台机器都要维护所有的传输链接,事实上每个链接都会占用系统的CPU、内存等硬件资源。
(3)在握手时容易被人利用攻击。
(4)在开发中如果要求整个数据要准确无误的传输给对方,这就需要要求可靠的应用,就需要用到TCP协议,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
UDP(用户数据报协议):
(1)只需要将消息发出去并不理会对方是否成功接收,所以它是不可靠的无链接的协议。
(2)由于不需要经过三次握确认重传和拥塞控制等机制,没有需要在传输数据时浪费通信流量和通信时间所以他开销很小,并且传输快。
(3)UDP协议能够传输的数据包大小不能超过64KB。
(4)在开发中当网络通信质量要求不高的时候,要求网络通讯速度能尽量快时就是用UDP协议。
使用TCP和UDP时容易陷入的误区
(1)不能直接认为哪种协议是不安全的。在数据传输的完整性讲,TCP是安全的。而在易攻击程度讲,UDP是安全的。
(2)从数据丢失角度讲,数据丢包是看网络的成分比较大,哪种协议其实都会有丢包。只是TCP协议如果发生丢包时可以利用send的返回值内容告诉某个端之后可以重传。而UDP协议发生丢包时就不会重传,但是可以从编码标记,将丢包的数据保存起来重新传输。
TCP协议的三次握手简单过程
(1)客户端 向服务器 发出连接请求;
(2)服务器 对客户端 授予请求;
(3)客户端 向服务器 确认。
(4)(第四次握手)两端之间断开链接。
什么是Socket?Socket在哪里?
Socket又称为套接字,是系统提供的用于网络通信的方法。网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称之为一个socket。应用程序通常通过“套接字”向网络发出请求或者回复网络请求。总之,网络请求是通过Socket来建立连接然后互相通信的。Socket的是指并不是一种协议,没有规定计算机应当以怎么样传递消息,只是给程序员提供了一个发送消息的接口,程序员使用这个接口的方法来发送与接收消息。Socket描述IP和端口,获取对方的IP和端口后就可以给对方发送消息,再由服务器来处理发送的这些消息。所以Socket一定包含了通信的双方,即客服端和服务器。
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
TCP和UDP在服务器和客户端的实现步骤
(1)TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
(2)TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
(3)UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
(4)UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
第五层,会话层(Session Layer)
通过传输层(端口号:传输端口与接收端口)建立数据传输的通路,在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文(而在会话层以下的数据传送单位中TCP叫做段、UDP叫做数据报)。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。 主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
(1)会话管理:允许用户在两个实体设备之间建立、维持和终止会话,并支持它们之间的数据交换。例如提供单方向会话或双向同时会话,并管理会话中的发送顺序,以及会话所占用时间的长短。
(2)会话流量控制:提供会话流量控制和交叉会话功能。
(3)寻址:使用远程地址建立会话连接。
(4)出错控制:从逻辑上讲会话层主要负责数据交换的建立、保持和终止,但实际的工作却是接收来自传输层的数据,并负责纠正错误。会话控制和远程过程调用均属于这一层的功能。但应注意,此层检查的错误不是通信介质的错误,而是磁盘空间、打印机缺纸等类型的高级错误。
第六层,表示层(Presentation Layer)
它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。
(1)数据格式处理:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。
(2)数据的编码:处理字符集和数字的转换。例如由于用户程序中的数据类型(整型或实型、有符号或无符号等)、用户标识等都可以有不同的表示方式,因此,在设备之间需要具有在不同字符集或格式之间转换的功能。
(3)压缩和解压缩:为了减少数据的传输量,这一层还负责数据的压缩与恢复。
数据的加密和解密:可以提高网络的安全性。
第七层,应用层(Application Layer)
如果两台计算机的应用程序要交换数据,A计算机需要先把信息发送到第七层的应用层。然后此层将信息发送到表示层(第六层),表示层将数据转送到会话层(第五层),如此继续,直至物理层(第一层)。
一张图揭露OSI七层模型里面各有什么东西吧!
应用层 | DHCP · DNS · FTP · Gopher · HTTP · IMAP4 · IRC · NNTP · XMPP · POP3 · SIP · SMTP · SNMP · SSH · TELNET · RPC · RTCP · RTP ·RTSP · SDP · SOAP · GTP · STUN · NTP · SSDP |
表示层 | HTTP/HTML · FTP · Telnet · ASN.1(具有表示层功能) |
会话层 | ADSP·ASP·H.245·ISO-SP·iSNS·NetBIOS·PAP·RPC· RTCP·SMPP·SCP·SSH·ZIP·SDP(具有会话层功能) |
传输层 | TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP |
网络层 | IP (IPv4 · IPv6) · ICMP · ICMPv6 · IGMP ·IS-IS · IPsec · BGP · RIP · OSPF ·ARP · RARP |
数据链路层 | Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ATM · DTM · 令牌环 · 以太网路 · FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN ·STP |
物理层 | 以太网路卡 · 调制解调器 · 电力线通信(PLC) · SONET/SDH(光同步数字传输网) · G.709(光传输网络) · 光导纤维 · 同轴电缆 · 双绞线 |
以后找时间把Socket编程的过程写一下,哈哈!