【 iOSSharing #5】2019-04-20

734 阅读7分钟

iOS Sharing 系列

目录

1. Scoket 连接和 HTTP 连接的区别

2. 关于 HTTP 的请求 GET 和 POST 的区别

3. HTTPS 加密过程与原理

4. Socket 原理

5. 关于 TCP 的慢启动特性


1. Scoket 连接和 HTTP 连接的区别

  • HTTP 协议是基于 TCP 连接的,是应用层协议,主要解决如何包装数据。Socket 是对 TCP/IP 协议的封装,Socket 本身并不是协议,而是一个调用接口(API),通过 Socket,我们才能使用 TCP/IP 协议
    • HTTP:短连接,客户端向服务器发送一次请求,服务器响应后连接断开,节省资源。服务器不能主动给客户端响应(除非采用 HTTP 长连接技术),iOS 目前主要使用类 NSURLSession
    • Socket:长连接,客户端跟服务器端直接使用 Socket 进行连接,没有规定连接后断开,因此客户端和服务器段保持连接通道,双方可以主动发送数据,一般多用于游戏。Socket 默认连接超时时间是30秒,默认大小是8K(可以理解为一个数据包大小)

2. 关于 HTTP 的请求 GET 和 POST 的区别

  • GET:参数在地址后拼接,没有请求数据,不安全(因为所有参数都拼接在地址后面),不适合传输大量数据(长度有限制,为1024个字节)

    • GET 提交、请求的数据会附在 URL 之后,即把数据放置在 HTTP 协议头<requestline>中以分割URL和传输数据,多个参数用&连接。如果数据是英文字母或数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用 BASE64 加密
  • POST:参数在请求数据区放着,相对 GET 请求更安全,并且数据大小没有限制。把提交的数据放置在 HTTP 包的包体<request-body>中

传输数据的大小:

  • GET 提交时,传输数据就会受到 URL 长度限制
  • POST 由于不是通过 URL 传值,理论上不受限,但一般服务器对于请求数据量大小有限制

安全性:

  • POST 的安全性要比 GET 的安全性高
  • 通过 GET 提交数据,用户名和密码将明文出现在 URL 上,比如登陆界面有可能被浏览器缓存
  • HTTPS:安全超文本传输协议(Secure Hypertext Transfer Protocol),它是一个安全通信通道,基于 HTTP 开发,用于客户计算机和服务器之间交换信息,使用安全套结字层(SSI)进行信息交换,即 HTTP 的安全版

3. HTTPS 加密过程与原理

  • 服务器端用非对称加密(RSA)生成公钥和私钥
  • 然后把公钥发给客户端, 服务器则保存私钥
  • 客户端拿到公钥后, 会生成一个密钥, 这个密钥就是将来客户端和服务器用来通信的钥匙
  • 然后客户端用公钥对密钥进行加密, 再发给服务器
  • 服务器拿到客户端发来的加密后的密钥后, 再使用私钥解密密钥, 到此双方都获得通信的钥匙

4. Socket 原理

  • Socket 概念: 套接字

    • 套接字是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口

    • 应用层通过传输层进行数据通信时,TCP 会遇到同时为多个应用程序进程提供并发服务的问题。多个 TCP 连接或多个应用程序进程可能需要通过同一个 TCP 协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与 TCP/IP 协议交互提供了套接字接口。应用层可以和传输层通过 Socket 接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务

  • Socket 建立连接:

    • 建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket,另一个运行于服务器端,称为 ServerSocket
    • 套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认
    • 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求
    • 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求
    • 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
  • Socket 连接与 TCP 连接

    • 创建 Socket 连接时,可以指定使用的传输层协议,Socket 可以支持不同的传输层协议(TCP或UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接
  • Socket 连接与 HTTP 连接

    • 由于通常情况下 Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态
    • 而 HTT P连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据
    • 很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是 Socket 连接,服务器就可以直接将数据传送给 客户端;若双方建立的是 HTTP 连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端

5. 关于 TCP 的慢启动特性

  • TCP 在连接过程的三次握手完成后,开始传数据,并不是一开始向网络通道中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞
  • TCP 使用了一个叫慢启动阈值(ssthresh)的变量,一旦cwnd>=ssthresh(大多数 TCP 的实现,通常大小都是65536)慢启动过程结束,拥塞避免阶段开始
  • 拥塞避免:cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着 RTT 开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值

联系方式

邮箱: adrenine@163.com

邮箱: holaux@gmail.com

邮箱: ledahapple@icloud.com