iOS中的Socket编程,socket,http,https基础知识(二)
在之前的那篇文章, 我们了解了一些关于Socket
的基础知识, 如果没有去看的朋友, 可以去看看玩转iOS开发:iOS中的Socket编程(一).
那么现在我们继续来讲讲剩下的一丢丢知识, 然后就开始来写我们的代码~
建立TCP连接
上一讲也说了, Socket
是基于TCP/IP
上的封装, 如果要了解Socket
的连接, 就要从TPC/IP
的连接入手.
我们日夜不分离的手机之所以能联网, 也是因为手机的底层实现了TCP/IP
协议, 可以让手机通过WiFi
,
4G
等无线网络进行通信.
建立起一个TCP
连接, 需要通过三次的验证, 我们这里称为三次握手
:
- 第一次握手: 由客户端发送一个叫做
SYN(SYN=J)
包到服务器, 并且进入SYN_SEND
状态, 然后就翘着二郎腿等服务器回应. - 第二次握手: 服务器接收到了
SYN
包, 必须确认客户端的SYN(ACK=J+1)
, 同时也会发送一个SYN(SYN=K)
包, 也就是SYN+ACK
, 此时轮到服务器跷二郎腿, 并且进入SYN_RECV
状态. - 第三次握手: 接收到了服务器发来的
SYN+ACK
包, 并向服务器发送确认包ACK(ACK=K+1)
, 发完之后, 客户端和服务器就会收起二郎腿并且进入ESTABLISHED
状态, 完成了三次握手
大概的情况就是酱紫:
这里注意一下, 在进行握手的时候, 所传送的包并不包含数据.
只有在完成三次握手之后, 客户端和服务器才会正式开始传输数据, 一般在TCP
连接建立成功后, 除非有一方主动关闭连接之前,
TCP
连接是会一直保持下去的, 比如我们的微信
, QQ
这些即时聊天App
.
关闭TCP连接
刚刚说完了如何建立起TCP
的连接, 现在我们来看看怎么关闭.
客户端和服务器都可以发起关闭TCP
连接的请求, 但是需要通过四次验证, 我们这里称为四次挥手
, 这里我们演示由客户端发起关闭TCP
连接:
- 第一次挥手: 客户端会发送一个
FIN
的报文给服务器之后就会进入等待服务器的响应. - 第二次挥手: 服务器接收到了
FIN
之后, 并确认是由客户端发起的, 同时也会发送一条ACK=X+1
的报文. - 第三次挥手: 等到客户端接受到
ACK
报文之后, 服务器关闭了与客户端的连接, 会发送一条FIN
的报文给客户端. - 第四次挥手: 客户端接收到了由服务器发送过来的
FIN
报文, 就会关闭与服务端的连接, 并且发送ACK
给服务器.
关系图:
有人或许有疑问说为啥TCP
建立连接的时候是三次握手, 而断开连接的时候却是四次挥手呢?
因为连接时服务端收到了客户端的SYN
连接请求的报文后, 可以直接发送SYN+ACK
报文, 其中的ACK
报文是用来响应,
SYN
报文是用来同步的.
而当关闭连接时, 服务端收到FIN
报文后, 很可能并不会马上就关闭Socket
连接, 所以只能先回复一个ACK
报文, 告诉客户端, 你发的FIN
报文我收到了, 只有等到服务器的所有报文发送完了, 服务端才会发送FIN
报文, 所以才需要四次挥手.
HTTP连接
本来并不打算把HTTP/HTTPS
也讲了, 但既然都说到这, 还是补上吧.
HTTP
是一个超文本传输协议, 全名叫做Hyper Text Transfer Protocol
, 是Web
互联网的基础, 也是我们手机联网常用的协议之一, 顺便说说,
HTTP
协议是建立在TCP
协议之上的一种应用.
用过HTTP
请求的都知道, HTTP
最显著的一个特点就是客户端每次发送的网络请求都需要服务端的响应, 在请求结束后, 会主动的关闭连接.
由于建立连接到关闭连接是一次性连接
, 所以HTTP/HTTPS
会被称为短连接
, 如果要保持长期在线的话, 需要不停的像服务器发送请求, 如果服务器长时间没有接收到客户端的请求, 就会认为客户端下线
了, 反过来, 如果客户端长时间没有接收到服务器的响应, 则认为网络断开
.
在HTTP 1.0
中, 客户端的每次请求都要求建立一次单独的连接, 在处理完本次请求后, 就自动释放连接. 而HTTP 1.1
中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行, 不需要等待一个请求结束后再发送下一个请求, 现在最新的HTTP 2.0
是兼容HTTP 1.1
的, 虽然说是新版, 但我个人感觉好像是优化版本, 只是提高了Web
的性能.
HTTPS连接
HTTPS
全名叫做Hyper Text Transfer Protocol over Secure Socket Layer
, 是HTTP
的安全版本, 主要是在HTTP
加了一层SSL
, 所以加密的时候就要用到SSL
加密.
HTTPS
存在于HTTP
与TCP
之间, HTTP
是以明文发送的, 不提供任何方式的数据加密, 所以非常容易受到攻击, 因为HTTP
协议不方便用来传输敏感信息, 但HTTPS
比较麻烦, 因为需要去申请一个CA
证书.
HTTP
和HTTPS
的区别:
-
HTTP
是超文本传输协议, 信息是明文传输,HTTPS
则是具有安全性的SSL
加密传输协议. -
HTTP
和HTTPS
使用的是完全不同的连接方式, 用的端口也不一样, 前者是80, 后者是443. -
HTTP
的连接很简单, 是无状态的,HTTPS
协议是由HTTP + SSL
协议构建的可进行加密传输、身份认证的网络协议.
Socket与HTTP的区别
虽然说Socket
和HTTP
都是基于TCP
, 但通常情况下Socket
连接就是TCP
连接, 一旦建立了Socket
连接, 双方就可以相互发送数据, 直到双方连接断开为止.
但在实际应用中,客户端到服务器之间的通信防火墙默认会关闭长时间处于非活跃状态的连接, 从而而导致Socket
连接断连,因此需要通过轮询告诉网络,该Socket
连接处于活跃状态。
而HTTP
刚刚也说了, 它的连接方式是请求 -> 响应
, 不仅要在请求的时候需要先建立好连接, 而且需要客户端向服务器发送请求后, 服务器才能回复数据.