iOS 学习 - 17.Socket

Socket 是应用层与 TCP / IP 协议通信的中间软件抽象层,它是一组接口 API
 
Web 使用 TCP 作传输层协议,以封装 HTTP 文本信息,然后使用 TCP/IP 做传输层协议将它发送到网络上.
Socket 是对 TCP/IP 协议的封装, Socket 本身并不是协议,而是一个调用接口(API),通过 Socket, 我们才能使用 TCP/IP 协议.
 
Socket 把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。
 
网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
IP 协议对应于网络层,TCP 协议对应于传输层,而 HTTP 协议对应于应用层
 
TCP/IP 是传输层协议,主要解决数据如何在网络中传输;
HTTP 是应用层协议,主要解决如何包装数据
 

 
区别:
(一)TCP 连接与 HTTP 连接的区别
HTTP 是基于 TCP 的,客户端往服务器发送一个 HTTP 请求时第一步就是要建立与服务端的 TCP 连接,也就是三次握手。从 HTTP 1.1 开始支持持久连接,也就是一次 TCP 连接可以发送多次的 HTTP 请求
 
(二)TCP 连接与 Socket 连接的区别
socket 层只是在 TCP/UDP 传输层上做的一个抽象接口层,因此一个 socket 连接可以基于 TCP,也有可能基于 UDP
基于 TCP 协议的 socket 连接同样需要通过三次握手建立连接,是可靠的;
基于 UDP 协议的 socket 连接不需要建立的过程,不管对方能不能收到都会发送过去,是不可靠的,大多数的即时通信 IM 都是后者。
 
(三)HTTP 连接与 Socket 连接的区别
1- HTTP 是短连接,Socket(基于 TCP 协议的)是长连接。尽管 HTTP 1.1 开始支持持久连接,但仍无法保证始终连接。而 Socket 一旦建立 TCP 三次握手,除非一方主动断开,否则连接状态一直保持。
2- HTTP 连接服务端无法主动发消息,Socket 连接双方的请求发送先后限制。这点就比较重要了,因此它将决定二者分别适合应用在什么场景下。
3- HTTP 采用“请求 - 响应”机制,在客户端还没发送消息给服务端前,服务端无法推送消息给客户端。必须满足客户端发送消息在前,服务端回复在后。
4- Socket 连接双方类似 P2P 的关系,一方可以随时可以向另一方喊话。
 
(四)什么时候用 HTTP,什么时候用 Socket
HTTP:
双方不需要时刻保持连接在线,比如客户端资源的获取、文件上传等
Socket:
大部分既时通讯应用(QQ、微信)
 

 
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快
 
TCP 是一种流模式
UDP 是一种数据包模式的协议
 

 
常用的 Socket 类型有两种:
1.流式 Socket (SOCK_STREAM
面向连接的 Socket,针对于面向连接的 TCP 服务应用
 
2.数据报模式
无连接的 Socket,对应于无连接的 UDP 服务应用
 

 
 
为啥要发送心跳包?
什么是心跳?
内网机器如果不主动向外发起连接,外网机无法直接连内网,这也是内网机安全的原因之一,又因为路由器会把内网发起的连接记录起来,但是过一段时间可能会记录丢失,所以客户端每隔一段时间都会向服务器发送消息,以保证服务器随时可以找到你,这个东西称之为心跳.
 
作用:
1.告诉服务器我还活着,别把我关了.
2.因为某种原因,我掉了,需要进行连接失败的操作了.
 

 
Socket 连接
Socket 连接就是所谓的长连接,理论上客户端和服务端一旦建立起连接将不会主动断掉,但是由于各种环境因素可能会是连接断开(服务端或客户端 down,网络故障。。。),所以说当一个 Socket 连接中没有数据的传输,那么为了维持连接需要发送心跳消息
 
HTTP 连接的区别:
通常情况下 Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,知道双方连接断开。但在实际应用中,客户端到服务器之间的通信防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于非活跃状态。
HTTP 连接使用的是“请求-响应”的方式,不仅在请求时需要建立连接,而且需要客户端向服务器端发出请求后,服务器端才能回复数据。//消耗资源,浪费宽带(HTTP HEAD 是比较大的),又消耗服务器 CPU 占用(没有消息也要接收消息);
 

 
socket 调用库函数主要有:
1.创建套接字
Socket (af, type, protocol)
2.建立地址和套接字的联系
bind (socked, local addr, addrlen)
3.服务器端侦听客户端的请求
listen (Sockid, quenlen)
4.建立服务器 / 客户端的连接 (面向连接 TCP
 
客户端请求连接
Connect (socked, destaddr, addrlen)
5.服务器端等待从编号为 Sockid 的 Socket 上接收客户端连接请求
newsockid = accept (Sockid, Clientaddr, paddrlen)
6.发送 / 接收数据
面向连接:
send (socked, buff, bufflen)
recv () 
7.面向无连接:
sendto (socked, buff,…, addrlen)
recvfrom ( )
8.释放套接字
close (sockid)
posted @ 2016-08-18 10:41  猪嘻嘻  阅读(237)  评论(0)    收藏  举报