一. 协议间的关系和特点
- 简单的关系划分
自上而下,
(1)http协议和webSocket(H5)协议是应用层的协议, 基于TCP协议,都需要''三次握手''建立连接
tcp和udp是传输层的,基于IP协议.
而IP协议是网络层的, 再下面就是...物理...
(2)而socket是什么? socket不是协议, 是对tcp/ip协议族的封装, 是一组api.
它的连接大部分是tcp连接,也有udp连接,
它的连接过程: 服务器监听, 客户端请求,确认连接.
2.特点
(1)http协议: "请求-响应"方式,只有c端发起了请求,s端才能给出响应.
(2)webSocket: "全双工"方式, c-s端可以互发消息(用于是ajax的进化版)
(3)socket接口: "全双工"方式, c-s端可以互发消息
二.http协议
1.http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系.
对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了标识同一个客户端, Web程序引入了Cookie机制来维护状态。
2.请求报文包括请求行line(get或post,url,协议版本号),请求头header,请求体(数据);响应报文包括Response line(状态码200 版本号),Response header和 返回数据body。
3.状态码:
200 OK
最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端
302 Found
重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的请求
304 Not Modified
代表上次的文档已经被缓存了, 还可以继续使用
404 Not Found 请求资源不存在(输错了URL)
500 Internal Server Error 服务器发生了不可预期的错误
- Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
三.webSocket协议
//www.greatytc.com/p/66b11dd71a5c webSocket模型分析
var ws = new WebSocket("ws://127.0.0.1:4000");
ws.onopen = function(){
console.log("succeed");
};
ws.onerror = function(){
console.log(“error”);
};
ws.onmessage = function(e){
console.log(e);
}
当 new 一个 websocket 对象之后,就会向服务器发送一个 get 请求!
这个请求是对某个服务器的端口发送的,一般的话,会预先在服务器将一个socket 绑定到一个端口上,客户端和服务器端在这个预定的端口上通信。
然后,在服务器端的socket监听到这个packet 之后就生成一个新的 socket,将发送过来的数据中的 Sec-WebSocket-Key 解析出来,然后按照把“Sec-WebSocket-Key”加上一个魔幻字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”。使用SHA-1加密,之后进行BASE-64编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。客户端收到这个之后,就会将 通信协议 upgrade 到 websocket 协议。
然后就会在这个持久的通道下进行通信,包括浏览器的询问,服务器的push,双方是在一个全双工的状态下相互通信。
三.socket接口(tcp、udp的封装)
服务器监听,客户端请求,连接确认
- (IBAction)connectToServer:(id)sender {
// 1.与服务器通过三次握手建立连接
NSString *host = @"133.33.33.1"; int port = 1212;
//创建一个socket对象
_socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
//连接 NSError *error = nil;
[_socket connectToHost:host onPort:port error:&error];
if (error) { NSLog(@"%@",error); }
}
#pragma mark -socket的代理
#pragma mark 连接成功
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{ NSLog(@"%s",__func__);
}
#pragma mark 断开连接
-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{
if (err) { NSLog(@"连接失败"); }else{ NSLog(@"正常断开"); }
}
#pragma mark 数据发送成功
-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{ NSLog(@"%s",__func__);
//发送完数据手动读取,-1不设置超时
[sock readDataWithTimeout:-1 tag:tag];
}
#pragma mark 读取数据
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSString *receiverStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%s %@",__func__,receiverStr);
}
四.tcp和udp的比较
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP:
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;