文章分享至个人我的技术博客: https://cainluo.github.io/14987134210457.htmlhtml
在以前的那篇文章, 咱们了解了一些关于Socket
的基础知识, 若是没有去看的朋友, 能够去看看玩转iOS开发:iOS中的Socket编程(一).git
那么如今咱们继续来说讲剩下的一丢丢知识, 而后就开始来写咱们的代码~github
上一讲也说了, 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
链接:
FIN
的报文给服务器以后就会进入等待服务器的响应.FIN
以后, 并确认是由客户端发起的, 同时也会发送一条ACK=X+1
的报文.ACK
报文以后, 服务器关闭了与客户端的链接, 会发送一条FIN
的报文给客户端.FIN
报文, 就会关闭与服务端的链接, 而且发送ACK
给服务器.关系图:
有人或许有疑问说为啥TCP
创建链接的时候是三次握手, 而断开链接的时候倒是四次挥手呢?
由于链接时服务端收到了客户端的SYN
链接请求的报文后, 能够直接发送SYN+ACK
报文, 其中的ACK
报文是用来响应, SYN
报文是用来同步的.
而当关闭链接时, 服务端收到FIN
报文后, 极可能并不会立刻就关闭Socket
链接, 因此只能先回复一个ACK
报文, 告诉客户端, 你发的FIN
报文我收到了, 只有等到服务器的全部报文发送完了, 服务端才会发送FIN
报文, 因此才须要四次挥手.
原本并不打算把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
全名叫作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
都是基于TCP
, 但一般状况下Socket
链接就是TCP
链接, 一旦创建了Socket
链接, 双方就能够相互发送数据, 直到双方链接断开为止.
但在实际应用中,客户端到服务器之间的通讯防火墙默认会关闭长时间处于非活跃状态的链接, 从而而致使Socket
链接断连,所以须要经过轮询告诉网络,该Socket
链接处于活跃状态。
而HTTP
刚刚也说了, 它的链接方式是请求 -> 响应
, 不只要在请求的时候须要先创建好链接, 并且须要客户端向服务器发送请求后, 服务器才能回复数据.