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

2,516 阅读6分钟

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


接着讲

在之前的那篇文章, 我们了解了一些关于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状态, 完成了三次握手

大概的情况就是酱紫:

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刚刚也说了, 它的连接方式是请求 -> 响应, 不仅要在请求的时候需要先建立好连接, 而且需要客户端向服务器发送请求后, 服务器才能回复数据.


最后

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

微信

支付宝