网络基础
问题:为什么要学习网络编程?
(1)网络编程是一种实时更新应用数据的常用手段
(2)网络编程是开发优秀网络应用的前提和基础-
网络基本概念
(1)客户端(就是手机或者ipad等手持设备上面的APP)
移动应用(iOS、android等应用)
(2)服务器 (远程服务器-本地服务器)
为客户端提供服务、提供数据、提供资源的机器
** 按照软件开发阶段来分,服务器可以大致分为以下2种 : **-
远程服务器
别名:外网服务器、正式服务器
使用阶段:应用上线后使用的服务器
使用人群:供全体用户使用
速度:取决于服务器的性能、用户的网速 -
本地服务器
别名:内网服务器、测试服务器
使用阶段:应用处于开发、测试阶段使用的服务器
使用人群:仅供公司内部的开发人员、测试人员使用
速度:由于是局域网,所以速度飞快,有助于提高开发测试效率
-
远程服务器
请求(客户端索要数据的方式)
客户端向服务器索取数据的一种行为响应(需要客户端解析数据)
服务器对客户端的请求做出的反应,一般指返回数据给客户端-
数据库(服务器的数据从哪里来)
Http
URL介绍
统一资源定位符
URL的全称是Uniform Resource Locator(统一资源定位符)
通过1个URL,能找到互联网上唯一的1个资源
URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URLurl格式(协议\主机地址\路径)
协议 :不同的协议,代表着不同的资源查找方式、资源传输方式
主机地址 :存放资源的主机(服务器)的IP地址(域名)
**路径 : **资源在主机(服务器)中的具体位置-
url的基本格式
URL的基本格式= (协议://) (主机地址) / (路径)
示例 : (https://) (www.baidu.com) / (img/bdlogo.gif)
-
协议
【file】访问的是本地计算机上的资源,格式是 : file://(不用加主机地址)
【ftp】访问的是共享主机的文件资源,格式是 : ftp://
【mailto】访问的是电子邮件地址,格式是 : mailto:
【http】超文本(媒体)传输协议,访问的是远程的网络资源,格式是 : http://
注 : http协议是在网络开发中最常用的协议-
TCP/IP协议簇
(1) 通常意义上,我们使用的网络是在TCP/IP协议簇的基础上运作的,而HTTP属于它内部的一个子集。
(2) 计算机与网络设备需要通信,双方就必须要基于相同的方法,比如具体应该如何探测通信目标,由哪一方面发起通信,使用什么语言进行沟通等等,所有的这一切都需要规则。而我们则把这些规则称之为协议(potocol)。
(3) 在协议中规定了很多的各式各样的内容,如选址方法,双方建立通信的顺序等等。这些协议如(ICMP DNS TCP FTP HTTP SNMP PPPoE IP FDDI)等等,通常我们把TCP/IP认为是在IP协议的通信过程中,使用到的协议簇的统称。
(4) TCP 协议簇里面最重要的一点就是分层设计:按照层次分别分为应用层、传输层、网络层和数据链路层。其中,与****HTTP****关系密切的协议有TCP、IP、DNS等。
-
Http协议
-
(1)http协议作用
a.超文本传输协议,全称是Hypertext Transfer Protocol
b."规定"客户端和服务器之间的"数据传输格式"
c.让客户端和服务器能有效地进行数据沟通
- (2)http协议优缺点
a.简单快速(协议简单,服务器端程序规模小,通信速度快)
b.灵活(允许传输各种数据)
c.非持续性连接(1.1之前版本是非持续的("短链接"),即限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间) -
(3)基本通信过程
a.请求:客户端向服务器索要数据
b.响应:服务器返回客户端相应的
- (4) URL的解析,及客户端与服务器之间的通讯过程
说明:
-
- 1,2,3,4是为了解析获取的主机域名和端口号
- 5是连接到解析后的主机地址的指定的端口
-
6,7,8是客户端发送请求以及服务器接收请求后返回数据,接收到数据后,链接关闭
-
TCP/IP协议簇
三次握手
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。
**三次握手的目的 : **是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。
-
三次握手的过程
**第一次握手 : **建立连接。
客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;**第二次握手 : **服务器收到SYN报文段。
服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;**第三次握手 : **客户端收到服务器的SYN+ACK报文段。
然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED(建立)状态,完成TCP三次握手。
当完成三次握手后,客户端与服务器就可以开始传输数据了.-
为什么要有三次握手
四次挥手
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次分手”.
-
四次挥手的过程
- **第一次分手 : **主机1(可以是客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
- **第二次分手 : **主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
- **第三次分手 : **主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
- **第四次分手 : **主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
**注 : **MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。 -
为什么要有四次挥手
-
四次挥手中的状态的含义
Http请求的发送
-
发送http请求的方法
在HTTP/1.1协议中,定义了8种发送http请求的方法
-- GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
-- 根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式(如:增 , 删 , 改 , 查)
-- "最常用的是GET和POST"(实际上GET和POST都能办到增删改查) -
GET和POST请求的对比
GET请求和POST请求的区别在于参数如何传递-
GET请求
在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开.
比如 : http://ww.test.com/loginusername=123&pwd=234&type=JSON
注意 : 由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB -
POST请求
发给服务器的参数全部放在请求体中
理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力) -
如何选择用户GET请求还是POST请求
除简单数据查询外,其它的一律使用POST请求
-
GET请求
a.如果要"传递大量数据",比如文件上传,"只能用POST请求"
b.GET的安全性比POST要差些,"如果包含机密\敏感信息","建议用POST"
c.如果"仅仅是索取数据"(数据查询),"建议使用GET"
d.如果是"增加、修改、删除数据","建议使用POST"
iOS中发送http请求的方案
- 苹果原生
NSURLConnection 03年推出的古老技术
NSURLSession:【重点】13年推出iOS7之后, 以取代NSURLConnection功能强大;
能支持后台网络请求与数据传输等;
CFNetwork: 底层技术、C语言的(前两种都是基于这个, 开发中基本用不 上) - 第三方框架
ASIHttpRequest: 外号“HTTP终结者”,功能极其强大,可惜早已停止更新
AFNetworking:【重点】简单易用,提供了基本够用的常用功能,维护和 使用者多
MKNetworkKit: 维护和使用者少, 功能强大, 但是上手较难
**建议 : ** 为了提高开发效率,企业开发用的基本是第三方框架
http请求通信的过程
(1)请求 : 【包括请求头+请求体(请求体非必选)】
(2)响应 : 【响应头+响应体】
(3)通信过程 :
a.发送请求的时候把请求头和请求体(请求体是非必须的)包装成一个请求对象
b.服务器端对请求进行响应,在响应信息中包含响应头和响应体,响应信息是对服务器端的描述,具体的信息放在响应体中传递给客户端
(4)状态码 :
【200】:请求成功
【400】:客户端请求的语法错误,服务器无法解析
【404】:无法找到资源
【500】:服务器内部错误,无法完成请求