美文网首页
18.iOS开发-Socket网络编程

18.iOS开发-Socket网络编程

作者: X先生_未知数的X | 来源:发表于2018-05-01 14:49 被阅读73次

    网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
    http协议对应于应用层

    tcp协议对应于传输层

    ip协议对应于网络层

    三者本质上没有可比性。 何况HTTP协议是基于TCP连接的。

    1.Socket简介

    首先让我们通过一张图知道socket在哪里?

    image

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

    2.TCP和UDP的区别

    在这里就必须讲一下udp和tcp的区别了

    TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

    UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

    关于TCP是一种流模式的协议,UDP是一种数据报模式的协议,这里要说明一 下,TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有 序的到达就行了,至于每次读取多少数据自己看着办。

    而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一 个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一 起,这样的数据是没有意义的。

    3.TCP三次握手和四次挥手

    相对于SOCKET开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的。因此开发者并不需要控制这个过程。但是对于理解TCP底层运作机制,相当有帮助。

    因此在这里详细解释一下这两个过程。

    TCP三次握手

    所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

    三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手

    image.png

    首先了解一下几个标志,SYN(synchronous),同步标志,ACK (Acknowledgement),即确认标志,seq应该是Sequence Number,序列号的意思,另外还有四次握手的fin,应该是final,表示结束标志。

    第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。

    第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的序列号加1以,即X+1。

    第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。

    TCP四次挥手

    TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

    image.png

    其实有个问题,为什么连接的时候是三次握手,关闭的时候却是四次挥手?
    因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来 同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端," 你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

    TCPsocket和UDPsocket的具体实现
    讲了这么久,终于要开始讲socket的具体实现了,iOS提供了Socket网络编程的接口CFSocket,不过这里使用BSD Socket。

    tcp和udp的socket是有区别的,这里给出这两种的设计框架

    基本TCP客户—服务器程序设计基本框架


    image.png

    基本UDP客户—服务器程序设计基本框架流程图


    image.png

    常用的Socket类型有两种:流式Socket(SOCK_STREAM) 和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连 接的Socket,对应于无连接的UDP服务应用。

    socket调用库函数主要有:

    创建套接字
    Socket(af,type,protocol)
    
    建立地址和套接字的联系
    bind(sockid, local addr, addrlen)
    
    服务器端侦听客户端的请求
    listen( Sockid ,quenlen)
    
    建立服务器/客户端的连接 (面向连接TCP)
    
    客户端请求连接:
    Connect(sockid, destaddr, addrlen)
    
    服务器端等待从编号为Sockid的Socket上接收客户连接请求
    newsockid=accept(Sockid,Clientaddr, paddrlen)
    
    发送/接收数据
    
    面向连接:
    send(sockid, buff, bufflen)       
    recv( )
    
    面向无连接:
    sendto(sockid,buff,…,addrlen)       
    recvfrom( )
    
    释放套接字:
    close(sockid)
    
    

    socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

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

    建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket,另一个运行于服务器端,称为ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

    HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议要比http协议安全。
    HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。

    HTTPS和HTTP的区别:

    (1)HTTP 是超文本传输协议,属于明文传输协议,HTTPS 则是具有安全性的基于ssl加密的传输协议

    (2)HTTP 和 HTTPS 使用的是连接方式不同,而且用的端口也不一样,前者是80,后者是443。

    (3)HTTP 是简单的无状态的连接。HTTPS 协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比 HTTP 协议安全

    (4)HTTPS 内容经过对称加密,每个连接生成一个唯一的加密密钥(对称秘钥:对称密钥加密又叫专用密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。)

    (5)HTTPS 内容传输经过完整性校验

    (6)https协议需要到ca申请证书,一般免费证书很少,需要交费,费用大概与.COM域名差不多,每年需要交大约几十元的费用。而常见的http协议则没有这一项;

    iOS开发网络篇—Socket编程

    HTTP都在这里

    相关文章

      网友评论

          本文标题:18.iOS开发-Socket网络编程

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