网络

http协议

  • http超文本传送协议,是应用层协义。
  • http协议规定,在用户发送请求前,必须先通过tcp的三次握手建立连接,所以说http链接是基于tcp协议的。

  • http请求使用的是“请求—响应”的方式,即客户端发送请求,服务器响应,然后链接立即断开。俗称短连接。

TCP与UDP

TCP:传输控制协议 ,是可靠协议,

会建立连接,形成数据传输通道,而且数据传输无大小限制,确保数据安全送达,但效率比较低。

UDP:用户数据报协议,是不可靠的协议,

无需建立连接,只是将数据源和目的地封装为一个数据包来进行发送,大小必须在64k之内。无法保证对方收到数据,但速度快,效率高。实际应用:电脑共享。发送短信,

长短连接

http连接就是所谓的短连接,请求使用的是“请求—响应”的方式,即客户端发送请求,服务器响应,然后链接立即断开。故俗称短连接。

socket连接就是所谓的长连接,由于通常情况下Socket连接采用tcp协议,所以也叫tcp长链接,而且Socket连接一旦建立,将不会主动断掉,通信双方开始相互发送数据内容,直到有一方主动断开连接,才会断开链接!

HTTP 协议和TCP/IP 协议的关系

tcp协议:传输层协议,也叫传输控制协议,解决数据如何分段和传输

ip协议:网络层协议,解决数据的网间寻址。

故TCP/IP协议,主要解决数据如何在网络中传输;

HTTP应用层协议,主要解决如何包装数据。

我们以web浏览为例:实质上无论客户端还是服务器都是使用HTTP协议做为应用层协议封装要传输的数据,然后使用TCP/IP协议将数据在网络间发送给目的端.

https协议和http协议概念

HTTPS就是安全的http协议,是在传输层和会话层之间加了一个SSL层(安全套接层),属于传输层协议!安全套接层付责数据的加密和解密,从而保证数据的安全传输。

SSL(Security Socket Layer ),安全套接层,用来保护浏览器和服务器之间的通信,在客户端和服务器之间提供服务器鉴别、可选客户鉴别和加密通信通道的功能。从而为TCP提供一种可靠的端对端的安全服务。

  • http是应用层协议,https 是传输层协议

SSL的服务端证书包含的信息有公钥,加密方案及其他信息

SSL的客户端证书包含公钥,支持的解密方案及其他信息

在一个https连接的网站里输入账号密码点击登录后,到服务器返回这个请求前,中间经历了什么

总的来说经历了ssl认证和一个普通的http请求2部分 ssl认证,即客户端和服务器的相互身份认证,确定传输的通信加密方法

首先服务器发证书给客户端,

客户端验证服务器证书后,发送证书给服务器(客户端证书中有客户端支持的加密方式)

服务端验证客户端证书后,选择一种高级别的加密方式,然后用私钥加密返回给客户端,这样就完成了身份认证。

然后是一个http请求,并使用客户端和服务器选择的加密方式进行数据加密。

http请求大致过程如下:

客户端把账户密码等信息打包为一个请求,

请求首先经过DNS解析器,把服务器的域名翻译为ip地址,

然后就把请求发送给IP地址所在的服务器,等待服务器的响应,

根据服务器的反应进行下一步操作。

TCP的三次握手链接

image

第一次握手:Client端发送连接请求报文(syn包),进入SYN_SEND状态等待服务器确认

第二次握手:Server端接收到客户端的请求连接报文后回复ACK报文,并为这次连接分配资源

第三次握手:client收到服务器的ACK报文后,向服务器发送ACK确认包,并为这次连接分配资源,至此完成三次握手,TCP连接就建立了!

TCP的四次挥手断开链接

image

中断连接可以由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报文,故需要四步才能断开连接。

关闭tcp连接时客户端收到服务器的FIN报文后,依然需要进入TIME_WAIT状态,经过2MSL(最大报文段生存时间)才能返回到CLOSE状态的原因是什么?

因为我们必须假设网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

http的post和get啥区别?

get主要用于从服务器获取数据,不会修改服务器数据,参数部分是直接跟在?之后,相当于是明文的,不是很安全,大小限制在1024k

post主要用于向服务器发送数据,会修改服务器数据,参数部分可以加密传递给请求的body部分,相对于get来说数据比较安全,且大小无限制。

套接字(socket)概念:

socket:是支持TCP/IP协议网络通信的基本操作单元,是对TCP/IP协议的封装和应用,它自身并不是协议,是开发者使用TCP/IP 协议的调用接口

建立socket连接

  • 创建Socket连接时,可以指定使用的传输层协议(TCP/UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接,

  • 建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket,数据在socket2端通过IO传输。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认

image

  • 服务器监听: 指服务器端套接字处于等待连接的状态,实时监听自己的端口,等待客户端的连接请求。

  • 客户端请求: 指客户端的套接字提出连接请求,指定要连接的服务器端套接字的地址和端口号,发起连接请求。

  • 连接确认: 指当服务器接收到客户端连接请求时,会响应客户端的链接请求,首先建立一个新的线程,然后把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字则继续监听其他客户端套接字的连接请求。

socket之即时通信流程

###

服务器和客户端通过socket建立tcp长链接后,两端就各有一个输入流和输出流, 其中输入流会一直监听输入通道,看有没有数据到来,有则去读取数据,当需要发送消息时,则通过输出流把消息传递给服务器,经过服务器的数据转发,把数据发送给另一个客户端socket的输入流。

Tcp长连接何时关闭连接?

一般不会主动关闭连接,但是为了防止客户端越来越多导致服务器崩溃,服务器会采用一些策略来关闭连接。

1.关闭一些长时间没有读写事件发生的连接,避免恶意链接

2.限制客户端的最大长连接数

tcp(socket)和http的数据输出模式和数据格式

http连接是“请求-响应”模式,只能是客户端发起请求,服务器响应,然后断开链接,传输的格式是规定好的 ,有请求头,请求体,响应头等

tcp链接则是,一旦客户端和服务器建立连接,则可互发消息,只到其中一方主动断开连接。传输的是原始的输入输出数据流

为什么出现socket。什么时候用socket?为什么http不够用?

HTTP连接使用的是“请求—响应”的方式,需要客户端向服务器发出请求后,服务器端才能回复数据

如果需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步,

这时http连接就不能满足需求了,需要双方建立Socket连接,服务器可以直接将数据传送给客户端。

因此,使用socket链接,可以使客户端定时向服务器端发送连接请求,不仅可以保持客户端在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

socket为什么会有粘包?

发送方发送的若干包数据到接收方接收时粘成一包,称作粘包,也就是后一包数据的头紧接着前一包数据的尾。

出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。

发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。

接收方引起的粘包是由于接收方不及时接收数据而导致的。因为接收方会先把收到的数据放在系统的接收缓冲区,用户进程从该缓冲区中读取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据就会放到前一包数据之后,等用户从缓存区获取数据是就一次取到了多包数据。

如何处理粘包就是收到收到粘包是如何分包

方式1.通过包头+包长+包体的协议形式,知道当服务器端获取到指定的包长时才说明获取完整。

方式2.指定包的结束标识,这样当我们获取到指定的标识时,说明包获取完整。

通过数据的包头格式,知道数据的长度和种类来处理各种业务类型

手机可以使用联网功能的原因是?

手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在接口一致的“无差别”的网络之上。

C/S(客户端/服务端),这种结构必须有客户端app

B/S(浏览器/服务端)>(Brower/service)

网络分层

image OSI参考模型(7层):物理层 数据链接层 网络层 传输层 会话层 表示层 应用层

TCP/IP模型(4层):网络接口层 网络层 传输层 应用层

HTTP会话过程

HTTP规定了客户/服务器模式的HTTP会话(事务)包括四个步骤:

a.与服务器建立连接

b.客户向服务器提出请求

c.服务器对请求作出应答

d.断开连接:客户端接收服务器所返回的应答信息并解析,然后客户机和服务器自动关闭连接。

socket包含进行网络通信必须的五种信息:

连接使用的传输层协议,
本地主机机IP,
本地进程端口,
远地主机IP,
远地进程端口。

IO传输:就是输入输出流,

其中 输入流I:用于读取数据;输出流O:用于写数据

socket连接在项目中的应用-网络电话

我们网络电话,为了保证通话质量,直播组件采用socket连接,此时我们的做法是。

1.在plist中添加voip后台模式

2.在应用即将进入后台时使用setKeepAliveTimeout来注册一个周期性的socket重连,设置周期为600s,来最大程度的减少重连接次数

3。在应用即将渐入前台时使用clearKeepAliveTimeout 关闭这个周期性的socket重连。

可能导致socket是连接断开的原因有哪些

1.服务器端或客户端主机down了,
2.网络故障,
3.或者两者之间长时间没有数据传输,即客户端发送多次(次数时提前定好的)心跳都收不到服务器的响应
4.网络防火墙可能会断开该连接以释放网络资源。

IP地址:

唯一标示网络设备的,比如129.168.1.4 与域名一一对应

端口:

用于标示进程的逻辑地址,一个端口号表示一个进程(即一个应用程序)

URL

同一资源定位 http;//IP:80/文件路径

如何确定一台设备(或者设备之间如何互相认识)

端口号和ip地址就可以唯一确定一台设备,故通过端口号和IP地址设备之间就可以互相认识

访问域名的流程

如www.baidu.com(域名) ->首先通过DNS服务器转化为百度的ip地址,然后通过这个ip地址访问百度服务器,

DSN:域名解析器,将域名解析为IP地址

传输协议:

用什么样式进行交互,即通信规则,常见协议TCP,UDP

HTTP:是一种数据格式,应用层协议,解决如何包装数据

举例说明: 从广东到北京,可以火车,飞机(tcp),到北京后,进行交流,用英语,国语(HTTP)

IM:即时通讯,支持用户实时交谈。

比如QQ,MSN,微信,等,区别在于各自通讯协议的实现,也就是说核心在于传输协议的不同。

协议用来说明信息在网络上如何传输,如果有了统一的传输协议,各个im之间可以直接通信

XMPP:

基于xml且开放的可扩展通信和表示协议,即xmpp协议,又称jabber协议

XMPP数据是以XML数据元流式传输,是C/S架构,是客户端通过tcp/ip的方式连接到服务器

xmpp中三个角色:客户端,服务器,网管, 通信可以发生在任何两者之间

基本的网络形式是单个客户端通过tcp/ip连接到单个服务端

XMPP的开源库是:XMPPFramework

微信协议和环信即使通信协议

注意:微信有自己即时通讯协议,即微信不是xmpp协议

环信即时通讯的协议是仿照xmpp协议,但不是xmpp协议

虚拟专用网络(Virtual Private Network ,简称VPN)

指的是在公用网络上建立专用网络的技术

ROM是只读内存(Read-Only Memory)的简称

RAM(Random Access Memory):

内部存储器,简称主存,可以与cpu直接交换数据

简单聊天室(socket)即socket即时通讯的实现:

方式一:使用OC的输入输出流和C语言socket相结合来实现

  • 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]

方式二.使用xmpp协议实现

git上有开源的xmpp框架,XMPPFrameWork,我们要做的就是根据整个框架提供的接口实现,登录注册,消息转发等功能

socket如何关闭

1.若客户端主动关闭,会先发送关闭消息给服务器,然后关闭客户端,服务器接收到关闭消息后会自动断开连接

2.若是服务器断开连接,则是服务器发送关闭消息,客户端接收到主动断开连接

socket的实现方式:

1.OC的输入输出流NSInputStream,NSoutputStream,及C语言的输入输出流CFReadStreamRef,CFWriteStreamref

结合C语言CFStream来实现,主要用于即时通讯,是阻塞式的socket。

2.GCDAsyncSocket第三方socket开源库,是异步socket,基于C语言实现。不会阻塞当前线程,实际是第一种方式的封装

GCDAsyncSocket实现原理:

异步socket,是基于c语言实现的 实现原理:

1.使用gcd创建异步线程并在线程中建立c语言级别的socket连接

2.在线程中建立c语言的输入输出,并分别设置读写回调

3.连接成功或者读写数据完成都会返回主线程,然后通过外部接口返回数据

缺点:每次发送数据后需要客户端主动去读取数据,否则获取不到服务器的返回

HTTP常用方法介绍:

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)响应,并以该消息作为客户端回收消息的实体。

http和https的区别

不同点:1)二者的协议头说明不同 2)url:http的url以http://开头,而https 以https:// 开头 3)默认端口号:http 是80. https 是443 4)在网络模型中的位置: http是应用层协议,https 是传输层协议 5)是否对传输的数据加密: http 不加密,https 加密 6)是否需要证书: http 不需要,https 需要证书 7)请求头 :二者请求头格式不同

HTTP 协议和TCP/IP 协议的关系

如果你仅仅只是传输数据,使用TCP/IP协议就够了,但是我们无法识别数据内容的含义,如果想要传输的数据有意义,也就是别人可以看懂是什么意思,就必须使用应用层协议 我们以web浏览为例 实质上无论客户端还是服务器端都是 使用HTTP 做为应用层协议封装了要传输的文本信息,然后 使用TCP/IP协议作为传输层协议将数据发送到网络上

AFNetwork如何做https适配

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在什么情况下回存在循环引用的问题,怎么解决?

在NSURLSession头文件中发现NSURLSessionDelegate是retain修饰的,所以需要自己释放urlsession。

解决办法是

1.在下载完成后和viewCon即将消失时,取消urlsession会话并释放session。并赋nil

[self.session invalidateAndCancel];
self.session =nil;

如何自己实现GET缓存?

iOS系统SDK已经为get请求做好了缓存。我们可以使用NSURLCache设置内存缓存大小、磁盘缓存大小、以及缓存路径,代码如下

NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];

[NSURLCache setSharedURLCache:urlCache];

如何提交一个Json格式的数据给后台服务器?用NSURLConnection/NSURLSession分别如何实现?

使用NSURLConnection发送请求的步骤是:

>使用请求路径NSURL创建一个NSURLRequest对象,

>使用NSURLConnection发送request

使用NSURLSession发送请求的步骤是

>获取sharedSession会话对象


>根据urlRequest创建请求任务NSURLSessionDataTask

>执行Task

当得到服务器返回的响应后,解析数据

JSRUN前端笔记, 是针对前端工程师开放的一个笔记分享平台,是前端工程师记录重点、分享经验的一个笔记本。JSRUN前端采用的 MarkDown 语法 (极客专用语法), 这里属于IT工程师。