写于: 2016年05月08日
这三个概念经常被谈到, 也是比较容易被混淆掉的概念. 在会回顾之前我们先看一下这三者在TCP/IP协议族中的位置关系:
HTTP是应用层的协议, 更靠近用户端;
TCP是传输层的协议; 而Socket是从传输层上抽象出来的一个抽象层,本质是接口.
所以本质上三种还是很好区分的.
尽管如此, 有时候你可能会懵逼, HTTP连接、TCP连接、Socket连接有什么区别?
好吧, 如果上面的图解释的还是不够清楚的话, 我们继续往下看.
1. TCP连接和HTTP连接的区别
上文提过, HTTP是基于TCP的, 客户端往服务端发送一个HTTP请求时第一步就是要建立与服务端的TCP连接, 也就是先三次握手, "你好, 你好, 你好". 从HTTP1.1开始支持持久连接, 也就是一次TCP连接可以发送多次的HTTP请求.
==小结: HTTP基于TCP==
2. TCP连接与Socket连接的区别
在图1 中我们提到, Socket层只是在TCP/UDP传输层上做得一个抽象接口层, 因此一个Socket连接可以基于连接, 也有可能基于UDP. 基于TCP协议的Socket连接同样需要三次握手建立连接, 是可靠的. 基于UDP协议的Socket连接不需要建立连接的过程, 不管对方能不能接收到都会发送过去, 是不可靠的, 大多数的及时通讯IM都是后者.
==小结: Socket也基于TCP==
3. HTTP连接和Socket连接的区别
区分这两个概念是比较有意义的, 毕竟TCP看不到摸不着, HTTP与Socket是实实在在能用到的.
HTTP是短连接, Socket(基于TCP协议的)是长连接. 尽管HTTP1.1开始支持持久连接, 但仍无法保证始终连接. 而Socket连接一旦建立TCP三次握手, 除非一方主动断开, 否则连接状态一直保持.
HTTP连接服务端无法主动发消息, Socket连接双方请求的发送先后限制. 这点比较重要了, 因为它将决定二者分别适合应用在什么场景下. HTTP采用"请求-响应"机制, 在客户端还没发送消息给服务端钱, 服务端无法推送消息给客户端. 必须满足客户端发送消息在前, 服务端回复在后. Socket连接双方类似peer2peer的关系, 一方可以向另一方喊话.
4. 问题来了:什么时候该用HTTP, 什么时候该用Socket
这个问题的提出是自然而然的. 当你接到一个与另一方的网络通讯需求, 自然会考虑用HTTP还是Socket.
- 用HTTP的情况: 双方不需要时刻保持连接在线, 比如客户端资源的获取、文件上传等
- 用Socket的情况: 大部分及时通讯应用(QQ、微信)、聊天室、苹果APNs等
在iOS中, 发HTTP请求一般用原生的 NSURLConnection、NSURLSession或者开源的AFNetworking(推荐)、ASIHttpRequest(已停止更新). 连接Socket连接 可以用CocosAsyncSocket.
The end
祝所有的母亲,节日快乐,健健康康!
==欢迎留言, 写的不对的地方还请不吝赐教.==