一、概念
- Socket 字面意思又称“套接字”
- 网络上的两个程序(如,客户端和服务器端)通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket。
-
应用程序一般是先通过Socket来建立一个通信连接,再向网络发出请求或响应网络请求。
image.png
说明:
1.客户端向服务器端发送网络请求前,必须要先在底层建立一个通信连接(通信管道),才能发送网络请求。
客户端向服务器端发送http请求,服务器返回数据,这个过程就是一个数据交换的过程。
客户端与服务器端进行数据交换,需要先建立一个双向的通信连接(即一条线、一个通道)
2.客户端和服务端 两端都有一个Socket,通过Socket建立一个连接(双向通信管道),有了管道就可以进行数据传输。
3.Socket 就是通信管道的两个端口,可以理解为管道的入口/出口。
二、网络通信的要素
网络上的请求就是通过Socket来建立连接然后互相通信
- IP地址(网络上主机设备的唯一标识)——>寻找服务器主机
- 端口号(定位程序) ——> 寻找程序
- 用于标示进程的逻辑地址,不同进程的标示
- 有效端口:065535,其中01024由系统使用或者保留端口,开发中建议使用1024以上的端口
- 传输协议(就是用什么样的方式进行交互)
- 通讯的规则
- 常见协议:TCP、UDP
三、传输协议 TCP/UDP
TCP和UDP:数据传输的两种方式,即把数据从一端传到另一端的两种方式
- TCP(传输控制协议) —>要建立连接(如:发送HTTP请求,客户端向服务端发送网络请求)
- 建立连接,形成传输数据的通道
- 在连接中进行大数据传输(数据大小不受限制)
- 通过三次握手完成连接,是可靠协议,安全送达
说明:在建立通信连接(打通管道)之前有三次握手,目的是为了数据的安全性和可靠性(让数据安全可靠的传输到对方)。
举例:打电话 (理解三次握手)
第一次握手:拿起电话,进行拨号。这个拨号的过程称为第一次握手。【开始准备连接】
第二次握手:拨通了,对方"喂"了一声(响应了一声),我听到了,称为第二次握手。【说明我连接你 没问题】
第三次握手:我听到了对方"喂"了一声(响应了一声),我也习惯性的"喂"了一声,对方听到了。【说明你连接我 没问题】
如果这三个过程都没有问题,就可以确定通话连接建立成功。
- 必须建立连接,效率会稍低。(每次请求都要建立连接)
- UDP(用户数据报协议)—>不建立连接 (如:广播用这个,不断的发送数据包)
- 将 数据 及 源 和 目的 封装成数据包中,不需要建立连接
- 每个数据报的大小限制在64KB之内
- 因为无需连接,因此是不可靠协议
举例:看老师广播讲课,网络卡主了,再看到的是最新的视频内容,不能接着看,可能错过了一些内容。
- 不需要建立连接,速度快 (省掉了三次握手操作)
四、Socket 通信流程图
image.png☞ bind():绑定端口 (80、3306)
☞ listen():监听端口(服务器监听客户端有没有连接到这个端口来)
☞ accept():如果有连接到这个端口,就接收这个连接。(通信管道打通,接下来就可以传输数据了)
☞ write():发请求/写请求/发数据
☞ read():读请求/读数据
- HTTP底层就是Socket通信,通过Socket建立连接(通信管道),实现数据传输,连接的方式(数据传输的方式)是TCP。
- HTTP是一个TCP的传输协议(方式),它是一个可靠、安全的协议。
五、体验 Socket
实现Socket服务端监听:
1.使用C语言实现。
2.使用 CocoaAsyncSocket 第三方框架(OC),内部是对C的封装。
telnet命令:是连接服务器上的某个端口对应的服务。
telnet命令:telnet host port
如:telnet www.baidu.com 80 (IP地址和域名一样,都能找到主机。)
六、长连接和短连接
长连接和短连接:是连接的一个保存状态(保存时间),长连接就是长时间连接,短连接就是短时间连接。
- http网络请求是短连接。
- 长连接用在即时通信(实时聊天,要随时随地的发送信息,考虑到性能,用长连接)
七、Socket 层上的协议
Socket层上的协议:指的数据传输的格式。
- HTTP协议:定义在网络上数据传输的一种格式。
传输格式:假设:这是假设,实际http的格式不是这样的。
http1.1,content-type:multipart/form-data,content-length:188,body:username=zhangsan&password=123456
- XMPP协议:是一款即时通讯协议 (别人定义好的协议,我们经常拿来用)
是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。
传输格式:
<from>zhangsan<from>
<to>lisi<to>
<body>一起吃晚上</body>
- 自定义即时通讯协议,json格式。
{
"from": "zhangsan",
"to": "lisi",
"body": "中午一起吃饭",
}
你做什么操作,必须要有一个固定的格式,这样服务器才知道你要做什么。
举例:写一封信给北京好友(区别 TCP/UDP 与 HTTP/XMMP)
- 数据传输的方式:TCP/UDP —》相当于 EMS/顺丰/申通/中通
- 数据传输的格式:HTTP/XMMP —》相当于 信的内容格式 (可以是中文/英文/…等)
网友评论