深入浅出-iOS的TCP/IP协议族剖析&&So

作者: Yangsc_o | 来源:发表于2016-02-17 19:26 被阅读25479次


    简介

    该篇文章主要回顾--TCP/IP协议族中的TCP/UDP、HTTP;还有Socket。(--该文很干,酝酿了许久!你能耐心看完吗?O_o)

    我在这个文章中,列举了常见的TCP/IP族中的协议,今天主角是--传输层协议。

    传输层(Transport Layer)是OSI(七层模型)中最重要、最关键的一层,它负责总体的数据传输和数据控制的一层,传输层提供端到端(应用会在网卡注册一个端口号)的交换数据的机制,检查分组编号与次序。传输层对其上三层如会话层等,提供可靠的传输服务,对网络层提供可靠的目的地站点信息。

    传输层中的协议

    • 传输层它为应用层提供会话和数据报通信服务。
    • 传输层承担OSI传输层的职责。
    • 传输层的核心协议是TCP和UDP。

    TCP提供一对一的、面向连接的可靠通信服务。TCP建立连接,对发送的数据包进行排序和确认,并恢复在传输过程中丢失的数据包。与TCP不同,UDP提供一对一或一对多的、无连接的不可靠通信服务。
    不论是TCP/IP还是在OSI参考模型中,任意相邻两层的下层为服务提供者,上层为服务调用者。下层为上层提供的服务可分为两类:面向连接服务和无连接服务。

    1. 面向连接的网络服务

    面向连接的网络服务又称为虚电路(Virtual Circuit)服务,它具有网络连接建立、数据传输和网络连接释放三个阶段。是按顺序传输可靠的报文分组方式,适用于指定对象、长报文、会话型传输要求。
    面向连接服务以电话系统为模式。要和某个人通话,首先拿起电话,拨号码,通话,然后挂断。同样在使用面向连接的服务时,用户首先要建立连接,使用连接,然后释放连接。连接本质上像个管道:发送者在管道的一端放入物体,接收者在另一端按同样的次序取出物体;其特点是收发的数据不仅顺序一致,而且内容也相同。--类似打电话

    1. 无连接的网络服务

    无连接网络服务的两实体之间的通信不需要事先建立好一个连接。无连接网络服务有3种类型:数据报(Datagram)、确认交付(Confirmed Delivery)与请求回答(Request reply)。
    无连接服务以邮政系统为模式。每个报文(信件)带有完整的目的地址,并且每一个报文都独立于其他报文,由系统选定的路线传递。在正常情况下,当两个报文发往同一目的地时,先发的先到。但是,也有可能先发的报文在途中延误了,后发的报文反而先收到;而这种情况在面向连接的服务中是绝对不可能发生的。--类似发短信

    传输控制协议(TCP)

    1. TCP全称是Transmission Control Protocol,中文名为传输控制协议,它可以提供可靠的、面向连接的网络数据传递服务。传输控制协议主要包含下列任务和功能:
    • 确保IP数据报的成功传递。
      • 对程序发送的大块数据进行分段和重组。
      • 确保正确排序及按顺序传递分段的数据。
      • 通过计算校验和,进行传输数据的完整性检查。
      • 根据数据是否接收成功发送肯定消息。通过使用选择性确认,也对没有收到的数据发送否定确认。
        为必须使用可靠的、基于会话的数据传输程序,如客户端/服务器数据库和电子邮件程序,提供首选传输方法。
    1. TCP工作原理
      TCP的连接建立过程又称为TCP三次握手;
    • 首先发送方主机向接收方主机发起一个建立连接的同步(SYN)请求;
    • 接收方主机在收到这个请求后向发送方主机回复一个同步/确认(SYN/ACK)应答;
    • 发送方主机收到此包后再向接收方主机发送一个确认(ACK),此时TCP连接成功建立.
      一旦初始的三次握手完成,在发送和接收主机之间将按顺序发送和确认段。关闭连接之前,TCP使用类似的握手过程验证两个主机是否都完成发送和接收全部数据。
      完成三次握手,客户端与服务器开始传送数据。

    三次握手示意图:


    三次握手.png

    TCP工作过程比较复杂,包括的内容如下。

    • TCP连接关闭:发送方主机和目的主机建立TCP连接并完成数据传输后,会发送一个将结束标记置1的数据包,以关闭这个TCP连接,并同时释放该连接占用的缓冲区空间。
    • TCP重置:TCP允许在传输的过程中突然中断连接。
    • TCP数据排序和确认*:在传输的过程中使用序列号和确认号来跟踪数据的接收情况。
    • TCP重传:在TCP的传输过程中,如果在重传超时时间内没有收到接收方主机对某数据包的确认回复,发送方主机就认为此数据包丢失,并再次发送这个数据包给接收方。
    • TCP延迟确认:TCP并不总是在接收到数据后立即对其进行确认,它允许主机在接收数据的同时发送自己的确认信息给对方。
    • TCP数据保护(校验):TCP是可靠传输的协议,它提供校验和计算来实现数据在传输过程中的完整性。

    用户数据报协议(UDP)

    UDP全称是User Datagram Protocol,中文名为用户数据报协议。UDP 提供无连接的网络服务,该服务对消息中传输的数据提供不可靠的、最大努力传送。这意味着它不保证数据报的到达,也不保证所传送数据包的顺序是否正确。
    我最初就有一个疑惑:“既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?”
    在有些情况下UDP可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大地降低了执行时间,使速度得到了保证。

    TCP与端口号

    TCP和UDP都是IP层面的传输协议,是IP与上层之间的处理接口。TCP和UDP端口号被设计来区分运行在单个设备上的多重应用程序的IP地址。由于同一台计算机上可能会运行多个网络应用程序,所以计算机需要确保目标计算机上接收源主机数据包的软件应用程序的正确性,以及响应能够被发送到源主机的正确应用程序上。该过程正是通过使用TCP或UDP端口号来实现的。
    --即每一个应用都会在网卡上注册一个端口号用来区分同一台设备上应用的之间的通信

    在TCP和UDP头部分,有“源端口”和“目标端口”段,主要用于显示发送和接收过程中的身份识别信息。IP 地址和端口号合在一起被称为“套接字”。TCP端口比较复杂,其工作方式与UDP端口不同。UDP端口对于基于UDP的通信作为单一消息队列和网络端点来操作,而所有TCP通信的终点都是唯一的连接。每个TCP连接由两个端点唯一识别。由于所有TCP连接由两对 IP 地址和TCP端口唯一识别(每个所连主机都有一个地址/端口对),因此每个TCP服务器端口都能提供对多个连接的共享访问
    再看一下IP数据包和TCP/UDP的数据包

    数据包.png

    HTTP协议

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
    http协议规定了客户端和服务器之间的数据传输格式.

    • http优点:

    简单快速:
    http协议简单,通信速度很快;
    灵活:
    http协议允许传输任意类型的数据;
    短连接:
    http协议限制每次连接只处理一个请求,服务器对客户端的请求作出响应后,马上断开连接.这种方式可以节省传输时间.

    http协议的使用

    1. 请求:客户端向服务器索要数据.
      http协议规定:一个完整的http请求包含'请求行','请求头','请求体'三个部分;
    • 请求行:包含了请求方法,请求资源路径,http协议版本. "GET /resources/images/ HTTP/1.1"
    • 请求头:包含了对客户端的环境描述,客户端请求的主机地址等信息.

    Accept: text/html ( 客户端所能接收的数据类型 )
    Accept-Language: zh-cn ( 客户端的语言环境 )
    Accept-Encoding: gzip( 客户端支持的数据压缩格式 )
    Host: m.baidu.com( 客户端想访问的服务器主机地址 )
    User-Agent: Mozilla/5.0(Macintosh;Intel Mac OS X10.10 rv:37.0) Gecko/20100101Firefox/37.0( 客户端的类型,客户端的软件环境 )

    • 请求体:客户端发给服务器的具体数据,比如文件/图片等.
    1. 响应:服务器返回客户端想要的数据
      http协议规定:一个完整的http响应包含'状态行','响应头','实体内容'三个部分;
    • 状态行:包含了http协议版本,状态吗,状态英文名称.
      "HTTP/1.1 200 OK"
    • 响应头:包含了对服务器的描述,对返回数据的描述.

    Content-Encoding: gzip(服务器支持的数据压缩格式) Content-Length: 1528(返回数据的长度)
    Content-Type:application/xhtml+xml;charset=utf-8(返回数据的类型)
    Date: Mon,15Jun201509:06:46GMT(响应的时间) Server: apache (服务器类型)

    • 实体内容:服务器返回给客户端的具体数据(图片/html/文件...).
    1. 发送http请求
      在iOS开发中,发送http请求的方案有很多,常见的有如下几种:
    • 苹果原生:

    NSURLConnection:
    用法简单,古老经典的一种方案.
    NSURLSession:
    iOS7以后推出的技术,功能NSURLConnection更加强大.
    CFNetWork:NSURL的底层,纯C语言,一般不用.

    • 第三方框架:
      AFNetWorking(OC);Alamofire(swift);

    http方法

    http协议定义了很多方法对应不同的资源操作,其中最常用的是GET和POST方法。
    eg:GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
    增:PUT
    删:DELETE
    改:POST
    查:GET
    因为GET和POST可以实现上述所有操作,所以,在现实开发中,GET和POST方法使用的最为广泛,除此以外HEAD请求使用频率也比较高;

    • GET

    在请求URL后面以?的形式跟上发给服务器的参数,参数以"参数名"="参数值"的形式拼接,多个参数之间用&分隔;
    GET的本质是从服务器得到数据,效率更高.并且GET请求可以被缓存.
    注意:GET的长度是有限制的,不同的浏览器有不同的长度限制,一般在2~8K之间;

    • POST

    POST的本质是向服务器发送数据,也可以获得服务器处理之后的结果,效率不如GET.POST请求不可以被缓存,每次刷新之后都需要重新提交表单.
    发送给服务器的参数全部放在'请求体'中;
    理论上,POST传递的数据量没有限制.
    注意:所有涉及到用户隐私的数据(密码/银行卡号等...)都要用POST的方式传递.

    • HEAD

    HEAD方法通常用在下载文件之前,获取远程服务器的文件信息!相比于GET请求,不会下载文件数据,只获得响应头信息!
    一般,使用HEAD方法的目的是提前告诉用户下载文件的信息,由用户确定是否下载文件!所以, HEAD方法,最好发送同步请求!

    响应消息

    1xx:信息响应类,表示接收到请求并且继续处理
    2xx:处理成功响应类,表示动作被成功接收、理解和接受
    3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
    4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
    5xx:服务端错误,服务器不能正确执行一个正确的请求;
    详细描述:状态码

    Socket

    Socket 简介

    • Socket起源于 20 世 纪 80 年代早期,最早由 4.1c BSD UNIX 引入,所以也称之为“BSD Socket 或者 Berkeley Socket”。BSD Socket 是事实上的网络应用编程接口标准,其它编程语言往往也是用与这套(用C写成的编程接口)类似接口。
    • 用 Socket 能够实现网络上的不同主机之间或同一主机的不同对象之间的数据通信。所以,现在 Socket 已经是一类通用通信接口的集合。
      大的类型可以分为网络 Socket 和本地 Socket 两种。

    本地上的两个进程如何通信?

    • 内存共享(munmap());
    • 消息和队列;
    • 管道(匿名管道pipe()和命名管道mkfifo());
    • 信号量(P V操作);
    • RPC remote protocol control
    • 本地Socket;

    网路上的两个进程如何通信?

    本地进程间通信(IPC)通过PID(在终端中输入ps -ef可查看PID)可以唯一确定彼此,然后通过共享内存,消息队列来通;网络上的两个进程确定彼此需要IP与端口号,通过传输层(TCP/UDP)协议进行通信;
    这就是网络 Socket 。
    socket可以理解为:在TCP/UDP 加一个端口(在网卡注册的,还记得吧)绑定。

    网路socket和 本地 Socket对比

    • 在同一个设备上,两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中可以使用PID来唯一标示一个进程;
    • PID只在本地唯一,网络中的两个进程PID冲突几率很大,此时显然不行了,怎么办?
      IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,所以可以利用ip地址+协议+端口号唯一标示网络中的一个进程。

    Socket通信就是一种确定了端口号的TCP/IP通信,或者说Socket通信与IP通信差别就是端口确定,协议确定。

    用一张图表达一下:


    Socket.png

    端口的打开是双方的,在C/S(Client&&Server)结构的TCP连接中不仅仅要注意到S的端口(监听的),实际上C也开了一个端口,而C端的端口是动态端口,TCP连接建立的时候,C端的端口会在三次握手结束后确定,动态打开一个,这个端口不受用户/程序员的控制。

    Socket C 端书写步骤

    1. 创建客户端Socket
    2. 创建服务器Socket
    3. 连接到服务器(Socket编程)
    4. 发送数据给服务器
    5. 接收服务器返回的数据
    6. 关闭Socket : close(socketNumber)

    一张经典的Socket C/S的步骤图。


    Socket.jpg
    1.  导入头文件
    #import <sys/socket.h> //socket相关
    #import <netinet/in.h>  //internet相关
    #import <arpa/inet.h>   //地址解析协议相关
    2. socket(创建)
         int socket(int, int, int);
        /**
         参数
         第一个int:domain:    协议域,AF_INET(IPV4的网络开发)
         第二个int:type:      Socket 类型,  SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文)
         第三个int:protocol:  IPPROTO_TCP,协议,如果输入0,可以根据第二个参数,自动选择协议
         返回值
         socket,如果 > 0 就表示成功
         */
    3. connection (连接到“服务器)
        connect(int, const struct sockaddr *, socklen_t)
        /**
         参数
         1> 客户端socket
         2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址
            服务器的"结构体"地址,C语言没有对象
         3> 结构体数据长度
         返回值
         0 成功/其他 错误代号
         */
    4. write(发送数据)
        send(int, const void *, size_t, int)
        /**
         参数
         1> 客户端socket
         2> 发送内容地址 void * == id
         3> 发送内容长度
         4> 发送方式标志,一般为0
         返回值
         如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
          */
    5. read (接收)
        recv(int, void *, size_t, int)
        /**
         参数
         第一个int :创建的socket
         void *:接收内容的地址
         size_t:接收内容的长度
         第二个int.:接收数据的标记 0,就是阻塞式,一直等待服务器的数据 
         返回值
         接收到的数据长度
         */
    6. close
        close(int);
        int:就是创建的socket
    

    按照上面5个步骤就可以写一个socket的通信的小demo:
    写好的已经放在了我的github
    此时没有写服务端,怎么测试?
    可利用:nc -lk 端口号:始终监听本地计算机此端口的数据。
    eg:nc -lk 6666;
    操作步骤gif
    1、监听 6666端口
    2、connettion;
    3、发送socket;服务器接收到socket
    4、服务端send :hello socket;

    操作步骤.gif

    S端socket通信步骤

    1. 提供一些服务
    2. 将这个服务与自己的IP地址、端口绑定
    3. 监听任何到这个IP+端口的TCP请求
    4. 接受/拒绝建立这个TCP连接
    5. 读写
    6. 断开TCP连接

    socket服务端下次再谈!
    以上就是本次回顾。


    参考资料1
    参考资料2
    参考资料3
    参考资料4
    参考资料5

    相关文章

      网友评论

      • Zzc皮卡丘:很干,腻害了
      • 写代码的天才:看完了,mark了
      • 梁森的简书:感觉好长
      • 因萌招人喷:厉害,找了那么多个socket终于找到了一个能帮到我的demo,谢谢
      • 代码移动工程师:ssize_t recvLen = recv(self.clientSocket, buffer, sizeof(buffer), 1);
        返回的是- 1导致 NSData *data = [NSData dataWithBytes:buffer length:recvLen];奔溃,请问怎么处理,以及为什么会出现
        0c97b882f0e8:你好,我也遇到这个问题,请问你解决了吗?
      • ChrisPaulss:还有就是换到真机就不行,换到模拟器才可以!这是什么原因
      • ChrisPaulss:不错不错,假如我想和别人进行数据传输,IP使用别人的么?端口号自定义行不行
      • 58fe5465d15f:Mark 支持一下,第400个喜欢哈哈
      • JasonWil:大神受教了
      • 6a229e844368:赞,楼主能不能交流下,我遇到点问题
      • d918fa20f2ec:大神,一年了,服务端还不出?
      • 南京小伙:服务器端呢?求更新:smile:
      • IFeng_iOSer:赞赞赞
      • DeadRabbit:膜拜学习中哈~
      • 田不语:写得很好,已收藏
      • iOS排头兵:发图片 音频咋弄啊 需要携带者发送者的用户信息
      • 出门右转掘金见:最后那几个资源挺不错的,不过能将它写的主题写出来就更好.
      • 出门右转掘金见:笔者写了这么多听不容易的,只是最后socket部分实在是看不懂,主要是我不会这一块,如果能补一些基础资料列出来就更好了.不过还是感谢笔者的分享.
      • 不留名的黄子嘉:有些错误.. 几个方法字面意思是那样 但是其实上都可以通用的 没有限制.. 只不过get方法如果拼接太长不好拿参数交互.. socket的话 也是理论 沾包拆包等问题怎么解决?:flushed:
      • 字节码:mark 慢慢消化
      • Pusswzy:请问这篇文章是你的原创么
      • ahyufei:作者知道tcp 发送报文吗?我现在做的项目智能家居类的,tcp 通讯需要发送报文和CRC验证,不知道作者对这块熟悉吗
      • ahyufei:大神有qq吗?有具体的问题想请教请教你
      • Tangdixi:PUT 的话应该是改, 指的是在指定位置上修改资源. 而 POST 可增可改.
      • 奔驰小跑:受益匪浅
      • 风与鸾:真心很赞,服务端什么时候开座啊~!
      • 编程小翁:另外,cocoachina上的http://www.cocoachina.com/ios/20160223/15347.html是你投稿的还是编辑主动转载你的呢
        Yangsc_o:@编程小翁 有人联系我,说要转载,然后就转载了
      • 编程小翁:写的不错。不过关于HTTP有个错误,”短连接:http协议限制每次连接只处理一个请求,服务器对客户端的请求作出响应后,马上断开连接.这种方式可以节省传输时间.” 这种特性是HTTP1.1之前才这么做的,从1999年开始HTTP1.1已经支持持久连接了,也就是keep-alive,一次连接可以发送多个请求
        Yangsc_o:谢谢指出
      • Seaboy灬:这个必须赞。:smile:
        Yangsc_o:@糖灬度 谢谢
      • ryugaku:٩( 'ω' )و 好棒
        Yangsc_o:@ryugaku 谢谢:stuck_out_tongue:
      • 你个傻瓜:有点理解了,但是我还是想咨询下:
        1,若某一方连续发2个text ,另一方只能接受一次,就是说只能我发一条,你回我一条,我才能在发,若我连续发两条,是不行的。
        2,真机测试,即时是在同一个wifi情况下,connect error。
        终端和真机, 模拟器和真机,都不能success。
        Yangsc_o:@你个傻瓜
        因为这个demo不是一个异步的socket,一边发送,另一方就会阻塞 等待相应。所以在实际的开发中,需要用异步的socket Eg:GCDAsyncSocket。

        nc -lk 端口号:始终监听本地计算机此端口的数据,所以真机没法测试 :unamused:



      • 溪枫狼:请问下大神,苹果有为UDP socket封装相关类吗?NSStream好像是用于TCP的,我们公司要用UDP,自己用C写的socket和服务器通信就崩,可以和电脑通信,后面只找到了cocoaAsyncSocket,没找到苹果封装的类。
        溪枫狼:谢谢,我用cOcoaaSyncsocket做了。
        Yangsc_o:@溪枫狼 真不是什么大神 :fearful: ,希望对你有用 :pray: http://www.2cto.com/kf/201406/308581.html
      • 赤脊山的豺狼人:太干了!看了一个小时…楼主是做通信开发的嘛
        Yangsc_o:@赤脊山的豺狼人 iOS即时通信主要还是用第三方,不然周期太长了 :smiley:
      • MonkeyBoy:非常好
        Yangsc_o:@MonkeyBoy 谢谢 :wink:
      • 泥巴锦:很棒
        Yangsc_o:@泥巴锦 谢谢 :wink:
      • Mach楚楚:请问上面Socket C/S的步骤图中TCP服务端在write()方法那里返回给TCP客户端的响应数据是什么内容。服务端在这个的上一步骤不是已经把请求数据跟客户端交互完了吗?
        Yangsc_o:@狗枭
        客户端发送(write):`socket`;
        服务器接收到(read):`socket`;

        服务端发送 即(write):`hello socket`
        客户端接收到(read):`hello socket`
      • HenryCheng:给赞
        Yangsc_o:@HenryCheng 谢谢 :wink:
      • _奔跑的炸鸡:mark
        TimberTang:写的好全~~ 收藏一波:blush:
        Yangsc_o:@_奔跑的炸鸡 谢谢支持 :wink:
      • R0b1n_L33:原理写的挺详细的而且通俗易懂
        想问下URL是不是放在请求头?
        南京小伙:服务器端的呢?求更新:smile:
        Yangsc_o:@ljysdfz 对呀,
        请求头:包含了对客户端的环境描述,客户端请求的主机地址等信息.
        Accept: text/html ( 客户端所能接收的数据类型 )
        Accept-Language: zh-cn ( 客户端的语言环境 )
        Accept-Encoding: gzip( 客户端支持的数据压缩格式 )
        Host: m.baidu.com( 客户端想访问的服务器主机地址 )
        User-Agent: Mozilla/5.0(Macintosh;Intel Mac OS X10.10 rv:37.0) Gecko/20100101Firefox/37.0( 客户端的类型,客户端的软件环境 )
      • 5654d3641a62:nc -lk 端口号:始终监听本地计算机此端口的数据 请问 能详细告知如何做到吗。。。 :joy:
        Pusswzy:@妮子的猫头鹰 mac nc: Permission denied 我一直报这个错误 没有办法监听端口
        5654d3641a62:@Yangcs 谢啦 我先去看看 不懂还回来问你哈
        Yangsc_o:@妮子的猫头鹰
        nc 是一个Linux命令,当然也可以说是unix的命令, 可以当做服务器,监听某个端口号。
        如果加上参数:-l 用于监听传入的数据链接 ;
        eg:nc -l 6666 监听某一次请求;
        如果向监听多次请求,那么就需要再加一个参数k:
        -k 当一个连接结束时,强制nc监听另一个连接。

        更多信息:参考博客 -- http://blog.csdn.net/wang7dao/article/details/7684998
        :smirk:
      • iOS程序犭袁:好全
        Yangsc_o:@iOS程序犭袁 谢谢 程序员大哥关注到😉😉
      • 854e76091c14:干货
        Yangsc_o:@bringbird 多喝点水好消化:smile:
      • 拉酷大王:很棒 爱你
        Yangsc_o:@拉酷大王 :stuck_out_tongue_winking_eye:谢谢支持
      • LaiYoung_:之前也看过一点关于这方面的东西,写的不错!:+1::+1:
        Yangsc_o:@LaiYoung 谢谢支持
      • 05928c0c7c63:66666
        Yangsc_o:@樱空释的爱1 谢谢支持:blush:
      • Autunight:跟ios没多少关系?
        Yangsc_o:@Autunight 有关系呀:sweat:
      • Joy___:点个赞
        Joy___:@Yangcs 已关注 😄
        Yangsc_o:@Martin_wjl 谢谢:+1: 你写的也很赞 我要再去读一下
      • 我有一个女朋友:很详细,介绍的不错
        Yangsc_o:@我有一个女朋友 有女朋友的人就是不一样:stuck_out_tongue_winking_eye:谢谢支持
      • b71b0154cf44:写的略散...而且大部分跟iOS没什么关系..有标题党的嫌疑..
        Yangsc_o:@sopdldo 谢谢 支持:smile:
        b71b0154cf44:@Yangcs 看的出还是用心了,支持一下
        Yangsc_o:@sopdldo 您有您的理解吧,如果搞即时通信,这些东西我觉得挺重要的 ;全文的思路就是 tcp udp http。最后是socket通信的一个demo。
      • GodLoveNan:大神感觉就是不一样,受教育了!
        Yangsc_o:@GodLoveNan 大神不敢当,巧哥 孤城 王巍才是大神级别的…
      • c96787cb33a7:先收藏,迟点看看
        Yangsc_o:@Luzy 感谢关注
      • 进击的小短腿:写的很不错
        Yangsc_o:@langbluesky 谢谢支持

      本文标题:深入浅出-iOS的TCP/IP协议族剖析&&So

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