TCP/IP协议、http协议、ftp协议
1、计算机之间交流、传递信息需要约定相应的协议,就好比人与人之间交流的语言一样,如果你用中文和一个不懂中文的外国人讲话,他根本就听不懂,只能一脸懵逼的看着你。
2、计算机网络传输常用的是7层网络传入协议,包括应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。
3、TCP/UDP属于传输层协议,http、ftp属于应用层协议。
其中TCP是面向连接的,可靠的、基于字节流的传输协议;
而http是超文本传输协议,一般是单向的,客户端发起,服务端响应,客户端确认收到,服务端断开连接结束。http是单向的,无连接,无响应状态的传输协议;
ftp是文件传输协议,使用TCP生成一个虚拟的链接用于控制信息,然后在生成一个单独的TCP连接用于传输数据。FTP有两种使用模式:主动和被动。主动模式要求客户端和服务器端同时打开并且监听一个端口以建立连接。在这种情况下,因为必须开放一个随机的端口以建立连接,当防火墙存在时,客户端很难过滤处于主动模式下的FTP流量。所以,创立了被动模式。被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。
套接字-socket
1、使用TCP传输需要确定一个链接的对象,问题是链接的对象上可能有多个应用在同时运行,如何将我们接收到的信息分配给对应的对象并做相应的处理呢?
2、这就产生了套接字,套接字主要用描述IP和端口号,系统分配对应的端口给相应的应用,端口号是唯一的并且绑定了指定的套接字,通过端口号找到要链接的应用对象。
3、通常一个基于TCP协议的客户端与服务器端的流程如下:
服务器程序开启,同时监听某个指定好的,大于1024的端口号;
客户端启动,并且按照服务器的IP与端口号向服务器访问;
服务器接到链接请求,链接接连成功,并且向客户端返回一个链接成功的返回包;
4、理论上,只要链接成功后,除非主动断开,否则认为链接一直存在,但实际上我们需要通过各种手段去判断链接状态是否正常,其中一种方式就是通过像服务器发送心跳包的形式,客户端向服务器发送一段固定的数据包,服务器根据收到的内容判断这个是心跳包,同时也返给客户端一个信息,告知可短短链接正常。
CocoaAsyncSocket
1、GCDAsyncSocket对象(以下简称GCDSocket**对象)都可以理解为一个socket套接字,我们的操作都是针对于这个socket执行的各种命令,可以打开一个端口侦听,同样也可以连接其他计算机的端口进行数据通讯等等等等。
2、创建一个GCDAsyncSocket对象,也即套接字对象。然后通过IP和端口链接到服务器。
GCDAsyncSocket socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err;
[socket connectToHost:@“192.168.10.111” onPort@”60000″ error:&err];
if (err != nil)
{
NSLog(@”%@”,err);
}
3、链接成功后会收到相应的响应
-(void)socket:(GCDAsyncSocket *)socket didConnectToHost:(NSString *)host port:(uint16_t)port {
// -1 表示没有超时限制 0用于区分读取的标识
[socket readDataWithTimeout:-1 tag:0];
}
4、收发消息后都会有有相应的响应
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
5、一旦链接成功后,我们就会派个门卫去蹲点,一旦有消息来了就通知前端做出响应,如更新UI,发送消息则会派个快递员去送消息,消息发送成功后也会回来报告消息发送成功了。
6、TCP通讯协议是一个基于字节流的运输层通信协议,其数据传输的形式也是以流的形式提现,而我感觉在使用GCDAsyncSocket的过程中我们可以很好的体会到流的概念,首先来说为什么这种TCP的这种传输形式要叫流而不像UDP中的那样叫做包?流之中又写入和读出的概念,我们可以把整个TCP通讯的连接看作为一条无水的河流,当然因为他没水所以你可以称它为沟,而向其写入数据即是向河流注入水,被写入的数据会向水一样流向连接的另一端。读即是从河流中取水,只要读得动作在继续,并且河流之中有水,那么我们就可以不停的取到数据,不论是河流之中有水你确没有去读亦或者是你去读了而河流之中没有水都会引发看起来完全相同的反应就是没有数据返回,所以在很多时候我们要处理更多的关于接收数据的逻辑的处理。正如我们目前使用的方法就是一种比较粗暴有效的方法——一旦开启连接读取的动作就永不停歇。
【参考】
[地址一]https://www.jianshu.com/p/5aecce087459
[地址二]https://www.jianshu.com/p/ad15c9565c34