http协议规定,在用户发送请求前,必须先通过tcp的三次握手建立连接,所以说http链接是基于tcp协议的。
http请求使用的是“请求—响应”的方式,即客户端发送请求,服务器响应,然后链接立即断开。俗称短连接。
TCP:传输控制协议 ,是可靠协议,
会建立连接,形成数据传输通道,而且数据传输无大小限制,确保数据安全送达,但效率比较低。
UDP:用户数据报协议,是不可靠的协议,
无需建立连接,只是将数据源和目的地封装为一个数据包来进行发送,大小必须在64k之内。无法保证对方收到数据,但速度快,效率高。实际应用:电脑共享。发送短信,
http连接就是所谓的短连接,请求使用的是“请求—响应”的方式,即客户端发送请求,服务器响应,然后链接立即断开。故俗称短连接。
socket连接就是所谓的长连接,由于通常情况下Socket连接采用tcp协议,所以也叫tcp长链接,而且Socket连接一旦建立,将不会主动断掉,通信双方开始相互发送数据内容,直到有一方主动断开连接,才会断开链接!
tcp协议:传输层协议,也叫传输控制协议,解决数据如何分段和传输
ip协议:网络层协议,解决数据的网间寻址。
故TCP/IP协议,主要解决数据如何在网络中传输;
HTTP应用层协议,主要解决如何包装数据。
我们以web浏览为例:实质上无论客户端还是服务器都是使用HTTP协议做为应用层协议封装要传输的数据,然后使用TCP/IP协议将数据在网络间发送给目的端.
HTTPS就是安全的http协议,是在传输层和会话层之间加了一个SSL层(安全套接层),属于传输层协议!安全套接层付责数据的加密和解密,从而保证数据的安全传输。
SSL(Security Socket Layer ),安全套接层,用来保护浏览器和服务器之间的通信,在客户端和服务器之间提供服务器鉴别、可选客户鉴别和加密通信通道的功能。从而为TCP提供一种可靠的端对端的安全服务。
SSL的服务端证书包含的信息有公钥,加密方案及其他信息
SSL的客户端证书包含公钥,支持的解密方案及其他信息
总的来说经历了ssl认证和一个普通的http请求2部分 ssl认证,即客户端和服务器的相互身份认证,确定传输的通信加密方法
首先服务器发证书给客户端,
客户端验证服务器证书后,发送证书给服务器(客户端证书中有客户端支持的加密方式)
服务端验证客户端证书后,选择一种高级别的加密方式,然后用私钥加密返回给客户端,这样就完成了身份认证。
然后是一个http请求,并使用客户端和服务器选择的加密方式进行数据加密。
http请求大致过程如下:
客户端把账户密码等信息打包为一个请求,
请求首先经过DNS解析器,把服务器的域名翻译为ip地址,
然后就把请求发送给IP地址所在的服务器,等待服务器的响应,
根据服务器的反应进行下一步操作。
第一次握手:Client端发送连接请求报文(syn包),进入SYN_SEND状态等待服务器确认
第二次握手:Server端接收到客户端的请求连接报文后回复ACK报文,并为这次连接分配资源
第三次握手:client收到服务器的ACK报文后,向服务器发送ACK确认包,并为这次连接分配资源,至此完成三次握手,TCP连接就建立了!
中断连接可以由Client端发起,也可以由Server端发起 以客户端中断连接为例
第一次握手:Client端向服务器发起中断连接请求报文(即FIN报文)
第二次握手:Server端接到客户端的FIN报文,先发送ACK报文,客户端进入FIN_WAIT状态,等待Server端的FIN报文
第三次握手:当Server端确定自身数据已发送完成,则向Client端发送FIN报文
第四次握手:Client端收到服务器的FIN报文后,发送ACK确认报文。进入TIME_WAIT状态。等待30秒左右,没有收到服务端的任何数据,证明服务端已正常关闭,然后客户端就会关闭tcp连接
关闭连接时,当Server端收到客户端的FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,故需要四步才能断开连接。
因为我们必须假设网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
get主要用于从服务器获取数据,不会修改服务器数据,参数部分是直接跟在?之后,相当于是明文的,不是很安全,大小限制在1024k
post主要用于向服务器发送数据,会修改服务器数据,参数部分可以加密传递给请求的body部分,相对于get来说数据比较安全,且大小无限制。
socket:是支持TCP/IP协议网络通信的基本操作单元,是对TCP/IP协议的封装和应用,它自身并不是协议,是开发者使用TCP/IP 协议的调用接口
创建Socket连接时,可以指定使用的传输层协议(TCP/UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接,
建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket,数据在socket2端通过IO传输。
服务器监听: 指服务器端套接字处于等待连接的状态,实时监听自己的端口,等待客户端的连接请求。
客户端请求: 指客户端的套接字提出连接请求,指定要连接的服务器端套接字的地址和端口号,发起连接请求。
连接确认: 指当服务器接收到客户端连接请求时,会响应客户端的链接请求,首先建立一个新的线程,然后把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字则继续监听其他客户端套接字的连接请求。
###
服务器和客户端通过socket建立tcp长链接后,两端就各有一个输入流和输出流, 其中输入流会一直监听输入通道,看有没有数据到来,有则去读取数据,当需要发送消息时,则通过输出流把消息传递给服务器,经过服务器的数据转发,把数据发送给另一个客户端socket的输入流。
一般不会主动关闭连接,但是为了防止客户端越来越多导致服务器崩溃,服务器会采用一些策略来关闭连接。
1.关闭一些长时间没有读写事件发生的连接,避免恶意链接
2.限制客户端的最大长连接数
http连接是“请求-响应”模式,只能是客户端发起请求,服务器响应,然后断开链接,传输的格式是规定好的 ,有请求头,请求体,响应头等
tcp链接则是,一旦客户端和服务器建立连接,则可互发消息,只到其中一方主动断开连接。传输的是原始的输入输出数据流
HTTP连接使用的是“请求—响应”的方式,需要客户端向服务器发出请求后,服务器端才能回复数据
如果需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步,
这时http连接就不能满足需求了,需要双方建立Socket连接,服务器可以直接将数据传送给客户端。
因此,使用socket链接,可以使客户端定时向服务器端发送连接请求,不仅可以保持客户端在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
发送方发送的若干包数据到接收方接收时粘成一包,称作粘包,也就是后一包数据的头紧接着前一包数据的尾。
出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。
发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
接收方引起的粘包是由于接收方不及时接收数据而导致的。因为接收方会先把收到的数据放在系统的接收缓冲区,用户进程从该缓冲区中读取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据就会放到前一包数据之后,等用户从缓存区获取数据是就一次取到了多包数据。
方式1.通过包头+包长+包体的协议形式,知道当服务器端获取到指定的包长时才说明获取完整。
方式2.指定包的结束标识,这样当我们获取到指定的标识时,说明包获取完整。
通过数据的包头格式,知道数据的长度和种类来处理各种业务类型
手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在接口一致的“无差别”的网络之上。
OSI参考模型(7层):物理层 数据链接层 网络层 传输层 会话层 表示层 应用层
TCP/IP模型(4层):网络接口层 网络层 传输层 应用层
HTTP规定了客户/服务器模式的HTTP会话(事务)包括四个步骤:
a.与服务器建立连接
b.客户向服务器提出请求
c.服务器对请求作出应答
d.断开连接:客户端接收服务器所返回的应答信息并解析,然后客户机和服务器自动关闭连接。
连接使用的传输层协议,
本地主机机IP,
本地进程端口,
远地主机IP,
远地进程端口。
其中 输入流I:用于读取数据;输出流O:用于写数据
我们网络电话,为了保证通话质量,直播组件采用socket连接,此时我们的做法是。
1.在plist中添加voip后台模式
2.在应用即将进入后台时使用setKeepAliveTimeout来注册一个周期性的socket重连,设置周期为600s,来最大程度的减少重连接次数
3。在应用即将渐入前台时使用clearKeepAliveTimeout 关闭这个周期性的socket重连。
1.服务器端或客户端主机down了,
2.网络故障,
3.或者两者之间长时间没有数据传输,即客户端发送多次(次数时提前定好的)心跳都收不到服务器的响应
4.网络防火墙可能会断开该连接以释放网络资源。
唯一标示网络设备的,比如129.168.1.4 与域名一一对应
用于标示进程的逻辑地址,一个端口号表示一个进程(即一个应用程序)
同一资源定位 http;//IP:80/文件路径
端口号和ip地址就可以唯一确定一台设备,故通过端口号和IP地址设备之间就可以互相认识
如www.baidu.com(域名) ->首先通过DNS服务器转化为百度的ip地址,然后通过这个ip地址访问百度服务器,
DSN:域名解析器,将域名解析为IP地址
用什么样式进行交互,即通信规则,常见协议TCP,UDP
举例说明: 从广东到北京,可以火车,飞机(tcp),到北京后,进行交流,用英语,国语(HTTP)
比如QQ,MSN,微信,等,区别在于各自通讯协议的实现,也就是说核心在于传输协议的不同。
协议用来说明信息在网络上如何传输,如果有了统一的传输协议,各个im之间可以直接通信
基于xml且开放的可扩展通信和表示协议,即xmpp协议,又称jabber协议
XMPP数据是以XML数据元流式传输,是C/S架构,是客户端通过tcp/ip的方式连接到服务器
xmpp中三个角色:客户端,服务器,网管, 通信可以发生在任何两者之间
基本的网络形式是单个客户端通过tcp/ip连接到单个服务端
XMPP的开源库是:XMPPFramework
注意:微信有自己即时通讯协议,即微信不是xmpp协议
环信即时通讯的协议是仿照xmpp协议,但不是xmpp协议
指的是在公用网络上建立专用网络的技术
内部存储器,简称主存,可以与cpu直接交换数据
1.开启socket服务器
2.客户端建立连接,分为5小步
1.与服务器完成三次握手建立连接(CFStreamCreatePairWithSocketToHost)
2.c语言的输入输出CFReadStreamRef转为oc的输入输出流NSOutputStream
3.输入输出流设置代理
4.把输入输出流加入主线程的runloop(因为只有在主线程的事件循环中才能才能检测网络变化
5)打开输入输出流
3.完成输入输出流的回调函数 stream:handleEvent;根据事件类型分别处理各种流事件,并完成登录事件
OpenCompleted:输入流或者输出流打开完成,可以理解为socket连接完成 HasBytesAvailable:输入流有事件,可以进行读取,解析服务器的返回信息 HasSpaceAvailable:输出流准备ok,可以发送数据,比如发送登录指令 endEncoutered:连接断开,需要关闭输入输出流 并在runloop中移除输入输 出流
4.发送消息,解析消息
发送数据使用 [ outputStream write]
消息和登录指令都是数据,区别仅仅只是格式不同,服务器接收到数据后只是进行数据转发
5.读取数据
[inoutStread read]
git上有开源的xmpp框架,XMPPFrameWork,我们要做的就是根据整个框架提供的接口实现,登录注册,消息转发等功能
1.若客户端主动关闭,会先发送关闭消息给服务器,然后关闭客户端,服务器接收到关闭消息后会自动断开连接
2.若是服务器断开连接,则是服务器发送关闭消息,客户端接收到主动断开连接
1.OC的输入输出流NSInputStream,NSoutputStream,及C语言的输入输出流CFReadStreamRef,CFWriteStreamref
结合C语言CFStream来实现,主要用于即时通讯,是阻塞式的socket。
2.GCDAsyncSocket第三方socket开源库,是异步socket,基于C语言实现。不会阻塞当前线程,实际是第一种方式的封装
异步socket,是基于c语言实现的 实现原理:
1.使用gcd创建异步线程并在线程中建立c语言级别的socket连接
2.在线程中建立c语言的输入输出,并分别设置读写回调
3.连接成功或者读写数据完成都会返回主线程,然后通过外部接口返回数据
缺点:每次发送数据后需要客户端主动去读取数据,否则获取不到服务器的返回
1.OPTIONS:简单说它的作用是查询信息
2.GET:请求资源
3.HEAD:主要是获取服务器响应的头信息,它的响应消息(response message)没有消息体(message body),只有消息头(message headers),作用是获取服务器的一些信息,以给客户端足够的信息决定接下来该如何去做。
4.POST:更新资料
5.PUT:请求资源,如果请求的URI是已经存在的资源,则PUT请求所附的实体应被当作修改服务器中的资源,成功的话返回200或者204。如果请求的URI资源不存在,则URI可以被定义成新的资源,这时,服务器必须通过201(建立)响应通知用户。
6.DELETE:要求服务器释放请求(request)中URI所指向的资源。在服务器上,DELETE方法可能会被强行制止,所以客户端不能担保操作已经实现,即使服务器返回的状态码说明操作已经成功完成了(当然,如果服务器返回了成功,说明服务器已经打算去删除/移动需要被删除的资源了)。
7.TRACE:TRACE 方法用于引起远程的,该请求消息的应用层回射。请求的最终接收者应该反射200(OK)响应,并以该消息作为客户端回收消息的实体。
不同点:1)二者的协议头说明不同 2)url:http的url以http://开头,而https 以https:// 开头 3)默认端口号:http 是80. https 是443 4)在网络模型中的位置: http是应用层协议,https 是传输层协议 5)是否对传输的数据加密: http 不加密,https 加密 6)是否需要证书: http 不需要,https 需要证书 7)请求头 :二者请求头格式不同
如果你仅仅只是传输数据,使用TCP/IP协议就够了,但是我们无法识别数据内容的含义,如果想要传输的数据有意义,也就是别人可以看懂是什么意思,就必须使用应用层协议 我们以web浏览为例 实质上无论客户端还是服务器端都是 使用HTTP 做为应用层协议封装了要传输的文本信息,然后 使用TCP/IP协议作为传输层协议将数据发送到网络上
1.新增一个类用来设置证书
(AFSecurityPolicy)customSecurityPolicy { // /先导入证书 NSString cerPath = [[NSBundle mainBundle] pathForResource:@"hgcang" ofType:@"cer"];//证书的路径 NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用证书验证模式 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO // 如果是需要验证自建证书,需要设置为YES securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = @[certData];
return securityPolicy; }
第二步:直接在请求方法的AFHTTPRequestOperationManager 中设置即可:
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
...
// 加上这行代码,https ssl 验证。
[mgr setSecurityPolicy:[self customSecurityPolicy]];
// 3.发送POST请求
在NSURLSession头文件中发现NSURLSessionDelegate是retain修饰的,所以需要自己释放urlsession。
解决办法是
1.在下载完成后和viewCon即将消失时,取消urlsession会话并释放session。并赋nil
[self.session invalidateAndCancel];
self.session =nil;
iOS系统SDK已经为get请求做好了缓存。我们可以使用NSURLCache设置内存缓存大小、磁盘缓存大小、以及缓存路径,代码如下
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
使用NSURLConnection发送请求的步骤是:
>使用请求路径NSURL创建一个NSURLRequest对象,
>使用NSURLConnection发送request
使用NSURLSession发送请求的步骤是
>获取sharedSession会话对象
>根据urlRequest创建请求任务NSURLSessionDataTask
>执行Task
当得到服务器返回的响应后,解析数据