美文网首页
Http、Https、TCP / UDP、Socket 整理

Http、Https、TCP / UDP、Socket 整理

作者: coder_xiang | 来源:发表于2020-04-23 16:35 被阅读0次
    • 首先给大家回顾一下互联网协议分层


      image.png

    HTTP

    HTTP的全称是Hypertext Transfer Protocol,超文本传输协议, 不管是移动客户端还是PC端,访问远程的网络资源经常使用HTTP协议, 例如访问百度主页:http://www.baidu.com

    HTTP协议的作用
    • 规定客户端和服务器之间的数据传输格式
    • 让客户端和服务器能有效地进行数据沟通
    • 简单快速 因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
    • 灵活 HTTP允许传输任意类型的数据
    image

    HTTP通信过程 - 请求和响应

    1. HTTP通信过程 - 请求

    HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容

    请求行:包含了请求方法、请求资源路径、HTTP协议版本

    GET /MJServer/resources/images/1.jpg HTTP/1.1

    请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息

    Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境
    Accept: text/html, /// 客户端所能接收的数据类型
    Accept-Language: zh-cn // 客户端的语言环境
    Accept-Encoding: gzip // 客户端支持的数据压缩格式

    请求体:客户端发给服务器的具体数据,比如文件数据

    2.HTTP通信过程 - 响应

    客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端, HTTP协议规定:1个完整的HTTP响应中包含以下内容:

    状态行:包含了HTTP协议版本、状态码、状态英文名称

    HTTP/1.1 200 OK

    响应头:包含了对服务器的描述、对返回数据的描述

    Server: Apache-Coyote/1.1 // 服务器的类型
    Content-Type: image/jpeg // 返回数据的类型
    Content-Length: 56811 // 返回数据的长度
    Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间

    实体内容:服务器返回给客户端的具体数据,比如文件数据

    image

    发送HTTP请求的方法

    • GET
      在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如http://ww.test.com/login?username=123&pwd=234&type=JSON
      注意:由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
    • POST
      发给服务器的参数全部放在请求体中
      理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
    • GET和POST的选择
      (1)如果要传递大量数据,比如文件上传,只能用POST请求
      (2)GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
      (3)如果仅仅是索取数据(数据查询),建议使用GET
      (4)如果是增加、修改、删除数据,建议使用POST

    Https

    • http及https区别
    1. 安全协议配置费用,https协议需要到ca申请证书,一般免费的很少,需要交费(当然,自建也可以)
    2. http是超文本传输协议,信息是明文传输,链接是无状态的,https则是具有安全性的ssl加密传输协议,更安全;
    3. http和https使用的是完全不同的连接方式,用的端口不一样,前者是80,后者是443;

    HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer----安全套接字层http协议)
    就是为了解决http的安全性问题而生的,为了数据的安全,https在http的基础上加入ssl协议,ssl依靠证书来验证服务器的身份,为浏览器和服务器之间的通信进行加密;

    • 公开密钥加密也称非对称加密,该加密算法使用两个不同的密钥:加密密钥(公钥)和解密密钥(私钥)。这两个密钥是数学相关的,某用户用加密密钥加密后所得的信息只能用该用户的解密密钥才能解密。RSA算法(由发明者Rivest,Shmir和Adleman姓氏首字母缩写而来)是著名的公开密钥加密算法。
      公钥加密的另一用途是身份验证:用私钥加密的信息,可以用公钥对其解密,接收者由此可知这条信息确实来自于拥有私钥的某人。私钥加密的过程即数字签名。
      用公钥加密的数据只有私钥才能解密;相反的,用私钥加密的数据只有公钥才能解密,正是这种不对称性才使得公用密钥密码系统被广泛应用。
    • 对称加密(如AES、DES,或者RC6), 对称加密因为使用相同的密钥来进行加密、解密,所以运行速度较快
    • SSL:安全套接字层(Secure Socket Layer,位于TCP/IP协议和HTTP协议之间)

    SSL 协议既用到了公钥加密技术(非对称加密),又用到了对称加密技术。

    1. 用公开密钥加密技术(非对称加密,通常为RSA)验证彼此身份(有时服务器不需要验证客户端身份),并协商Step2中通讯时所用的对称加密密钥;
    2. 用对称密钥加密技术(如AES、DES,或者RC6)加密服务器端和客户端通讯时的数据。
      这样做的好处是:公开密钥加密(非对称加密)相对复杂,速度慢,可用来完成安全性要求较高的身份认证、密钥协商等事务;对称加密技术相对简单,速度快,可用来加密客户端与服务端之间传输的数据内容。

    HTTPS 客户端与服务器交互过程

    1. 客户端发送请求,服务器返回公钥给客户端;
    2. 客户端生成对称加密秘钥,用公钥对其进行加密后,返回给服务器;
    3. 服务器收到后,利用私钥解开得到对称加密秘钥,保存;
    4. 之后的交互都使用对称加密后的数据进行交互。

    主要是身份验证(非对称加密),客户端和服务端主要交换了三个信息:

    1. 数字证书:该信息是我们进行开发需要关注的!数字证书包含了公钥等信息,一般由服务器发给客户端,接收方通过验证这个证书是不是由信赖的CA签发(花钱),或者与本地的证书相对比(自建),来判断证书是否可信;假如需要双向验证,则服务器和客户端都需要发送数字证书给对方验证;
    2. 3个随机数:3个随机数是用于生成对话密钥的;
    3. 加密通信协议:客户端和服务器端通信需要采取同样的加密通信协议(哪种对称加密技术,AES、DES、RC6);

    AFNetworking集成https

    如果你们公司是到正规机构申请的证书,那么恭喜你,你什么都不用做,AFNetworking 内部帮我们封装了HTTPS的请求方式,你只需要把URL改成https:// 就好了
    如果你们是自建的证书,那么也很简单
    生成.cer证书:

    openssl x509 -in <你的服务器证书>.pem -outform der -out server.cer
    
    

    向项目中倒入.cer证书,然后设置securityPolicy;

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
    // 2.设置证书模式
    NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
    NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
    // 客户端是否信任非法证书
    mgr.securityPolicy.allowInvalidCertificates = YES;
    // 是否在证书域字段中验证域名
    [mgr.securityPolicy setValidatesDomainName:NO];
    
    

    参考文章
    http://www.jianshu.com/p/75d96b72bfb1
    http://m.blog.csdn.net/article/details?id=53991422

    TCP、UDP、IP、Socket

    IP 协议对应于网络层;
    TCP、UDP协议对应于传输层;
    HTTP, HTTPS协议对应于应用层;
    socket则是对TCP/IP协议族的封装和应用;
    可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据

    这里用一个比喻来形容: 手机端 和 服务器端是两个城堡, 两个城堡要运输水果, TCP可以比喻成连接两个城堡的公路, 这条公路建立好了可以不停的稳定地运输水果过去. 而socket就是用来搭建这条公路的工具. DUP比如成一个大炮, 把水果从A城堡发射到B城堡. http比如成三轮车用来包装运输水果的, https比喻成武装车用来包装运输水果的

    1. socket

    socket是对TCP/IP协议族的封装,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等
    传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,

    ios端关于socket的开发可以使用CocoaAsyncSocket来实现,因为本人项目中没实际应用过,所以就不多说了;
    git:https://github.com/robbiehanson/CocoaAsyncSocket
    网上的简例:
    http://www.jianshu.com/p/3e4f3de18e3b
    https://my.oschina.net/joanfen/blog/287238

    2. TCP、UDP
    • TCP(Transmission Control Protocol 传输控制协议)

    TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;

    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连接的请求,断开过程需要经过“四次握手”
    
    http连接与TCP连接的区别:
    HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
    理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
    
    
    • UDP(User Datagram Protocol 用户数据报协议)

    UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议
    也正由于上面的特点,使得UDP的开销更小数据传输速率更高,因为不需进行三次握手和对收发数据的确认,所以UDP的实时性更好;

    相关文章

      网友评论

          本文标题:Http、Https、TCP / UDP、Socket 整理

          本文链接:https://www.haomeiwen.com/subject/lukaihtx.html