玩转iOS开发:iOS中的Socket编程(二)

文章分享至个人我的技术博客: https://cainluo.github.io/14987134210457.htmlhtml


接着讲

在以前的那篇文章, 咱们了解了一些关于Socket的基础知识, 若是没有去看的朋友, 能够去看看玩转iOS开发:iOS中的Socket编程(一).git

那么如今咱们继续来说讲剩下的一丢丢知识, 而后就开始来写咱们的代码~github


创建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状态, 完成了三次握手

大概的状况就是酱紫:微信

1

这里注意一下, 在进行握手的时候, 所传送的包并不包含数据.网络

只有在完成三次握手以后, 客户端和服务器才会正式开始传输数据, 通常在TCP链接创建成功后, 除非有一方主动关闭链接以前, TCP链接是会一直保持下去的, 好比咱们的微信, QQ这些即时聊天App.性能


关闭TCP链接

刚刚说完了如何创建起TCP的链接, 如今咱们来看看怎么关闭.优化

客户端和服务器均可以发起关闭TCP链接的请求, 可是须要经过四次验证, 咱们这里称为四次挥手, 这里咱们演示由客户端发起关闭TCP链接:

  • 第一次挥手: 客户端会发送一个FIN的报文给服务器以后就会进入等待服务器的响应.
  • 第二次挥手: 服务器接收到了FIN以后, 并确认是由客户端发起的, 同时也会发送一条ACK=X+1的报文.
  • 第三次挥手: 等到客户端接受到ACK报文以后, 服务器关闭了与客户端的链接, 会发送一条FIN的报文给客户端.
  • 第四次挥手: 客户端接收到了由服务器发送过来的FIN报文, 就会关闭与服务端的链接, 而且发送ACK给服务器.

关系图:

2

有人或许有疑问说为啥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存在于HTTPTCP之间, HTTP是以明文发送的, 不提供任何方式的数据加密, 因此很是容易受到攻击, 由于HTTP协议不方便用来传输敏感信息, 但HTTPS比较麻烦, 由于须要去申请一个CA证书.

HTTPHTTPS的区别:

  • HTTP是超文本传输协议, 信息是明文传输, HTTPS则是具备安全性的SSL加密传输协议.
  • HTTPHTTPS使用的是彻底不一样的链接方式, 用的端口也不同, 前者是80, 后者是443.
  • HTTP的链接很简单, 是无状态的, HTTPS协议是由HTTP + SSL协议构建的可进行加密传输、身份认证的网络协议.

3


Socket与HTTP的区别

虽说SocketHTTP都是基于TCP, 但一般状况下Socket链接就是TCP链接, 一旦创建了Socket链接, 双方就能够相互发送数据, 直到双方链接断开为止.

但在实际应用中,客户端到服务器之间的通讯防火墙默认会关闭长时间处于非活跃状态的链接, 从而而致使Socket链接断连,所以须要经过轮询告诉网络,该Socket链接处于活跃状态。

HTTP刚刚也说了, 它的链接方式是请求 -> 响应, 不只要在请求的时候须要先创建好链接, 并且须要客户端向服务器发送请求后, 服务器才能回复数据.


最后

码字很费脑, 看官赏点饭钱可好

微信

支付宝
相关文章
相关标签/搜索