PHP 网络编程小白系列 —— 初探

这篇文章我打算先丢出一个引子来引发各位读者对于网络思考,而后慢慢聊到网络链接的程序,这跟socket 又有什么关系,操做 socket 时咱们须要了解的通讯规则以及通讯数据会产生的几种状态例如:同步、异步、死锁、解锁、阻塞。

引子 —— 网络是怎么链接的?

有一个经典的问题:当你在浏览器输入一个网址后,你是如何获取到了想要的内容,这其中发生了什么?html

若是要完整的回答这个问题,恐怕写一本书都不算多,这里大体说说有几个环节和里面的点:编程

1.浏览器会根据通讯协议解析 uri 生成请求消息
2.浏览器访问 DNS 服务器解析请求 uri 为 ip 地址
3.浏览器调用 socket 库委托操做系统中的协议栈发送请求消息
4.网卡将数字信号转换为电信号输出网线
5.交换机将电信号再次转换为数字信号
6.解包
7.根据 socket 控制信息(ip、端口、状态)到达应用程序浏览器

上面有几个注意的问题:服务器

a. 一、2 顺序不能颠倒,网上有说先 DNS 解析是错误的
b. 库就是一组程序的集合,socket 库是让其余应用可使用操做系统的网络功能
c. 协议栈包括 Tcp、Udp、Ip、Arp...各类协议网络

能够看到一个简单的网络链接是须要不少网络部件参与才能正常工做,咱们主要关心第三步的实现即这个 socket 程序组件的运用,对于开发者来讲这个 socket 是网络链接的关键也是咱们网络编程的关键。并发

什么是网络编程?

一句话: 经过 coding 实现网络通讯的的行为异步

什么是 socket?

一句话: 收发通讯数据的管道(请求|响应消息都要经过 socket)socket

你可能还须要了解的东西?

有些东西在网络链接过程当中咱们是看不到的或者说在编写程序的时候不会直接使用,可是在实际编写网络程序的时候咱们必须遵照其中的规则,因此咱们仍是颇有必要了解的。ide

TCP 三次握手和四次挥手

  • socket 链接的时候就是在握手哈

先看一个有趣的解释:函数

咱们举一个现实生活中两我的进行语言沟通的例子来模拟三次握手。
第一次对话:
老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么?
结果乙带着耳机听歌呢,根本没听到,没反应。甲内心想:跟你说话也没个音,不跟你说了,沟通失      败。说明乙接受不到甲传过来的信息的状况下沟通确定是失败的。
若是乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。
第二次对话:
乙听到了甲说的话,可是他是老外,中文很差,不知道甲说的啥意思也不知道怎样回答,因而随便回答了一句学过的中文 :我去厕所了。甲一听马上笑喷了,“去厕所吃饭”?道不一样不相为谋,离你远点吧,沟通失败。说明乙没法作出正确应答的状况下沟通失败。
若是乙听到了甲的话,作出了正确的应答,而且还进行了反问:我吃饭了,你呢?那么第二次握手成功。
经过前两次对话证实了乙可以听懂甲说的话,而且能作出正确的应答。接下来进行第三次对话。
第三次对话:
甲刚和乙打了个招呼,忽然老婆喊他,“你个死鬼,打个酱油咋这么半天,看我回家咋收拾你”,甲是个妻管严,听完吓得二话不说就跑回家了,把乙本身晾那了。乙心想:这什么人啊,得,我也回家吧,沟通失败。说明甲没法作出应答的状况下沟通失败。
若是甲也作出了正确的应答:我也吃了。那么第三次对话成功,两人已经创建起了顺畅的沟通渠道,接下来开始持续的聊天。
经过第二次和第三次的对话证实了甲可以听懂乙说的话,而且能作出正确的应答。
可见,两我的进行有效的语言沟通,这三次对话的过程是必须的。

同理,链接拆除时须要两方都肯定才能真正拆除,因此须要四次挥手

再具体看看图示:

TCP 协议建立
  • 客户端主动调用 connect 发送 SYN 分节
  • 服务器端必须回复一个 ACK 分节来确认客户端 SYN 分节,并发送一个 SYN 分节到客户端
  • 客户端对服务器端发送的 SYN 分节进行 ACK 确认

wm

TCP 协议拆除
  • 首先申请拆除的一端调用 close 发送一个 FIN 分节
  • 另外一端接收到 FIN 分节时,发送一个 ACK 分节进行确认
  • 同理,另外一端要申请拆除链接时,也要发送一个 FIN 分节
  • 接收端发送 ACK 分节进行确认

wm

阻塞/非阻塞

这两个概念是针对 IO 过程当中进程的状态来讲的,阻塞 IO 是指调用结果返回以前,当前线程会被挂起;相反,非阻塞指在不能马上获得结果以前,该函数不会阻塞当前线程,而会马上返回。

同步/异步

这两个概念是针对调用若是返回结果来讲的,所谓同步,就是在发出一个功能调用时,在没有获得结果以前,该调用就不返回;相反,当一个异步过程调用发出后,调用者不能马上获得结果,实际处理这个调用的部件在完成后,经过状态、通知和回调来通知调用者。

I/O 多路复用

多路复用(IO/Multiplexing):为了提升数据信息在网络通讯线路中传输的效率,在一条物理通讯线路上创建多条逻辑通讯信道,同时传输若干路信号的技术就叫作多路复用技术。对于 Socket 来讲,应该说能同时处理多个链接的模型都应该被称为多路复用,目前比较经常使用的有 select/poll/epoll/kqueue 这些 IO 模型(目前也有像 Apache 这种每一个链接用单独的进程/线程来处理的 IO 模型,可是效率相对比较差,也很容易出问题,因此暂时不作介绍了)。在这些多路复用的模式中,异步阻塞/非阻塞模式的扩展性和性能最好。

参考连接语扩展阅读

改变世界的TCP/IP协议
What is socket?
《网络是怎么链接的》

初探结语

简单说明网络编程就是利用 socket 程序组件实现网络链接的,在具体操做 socket 的时候会涉及一些额外的知识点,整篇文章很简单没有深刻探究某个点,天然也不会很完备,这也是对本系列文章的定位,以后写网络通讯模型的时候会结合具体例子来阐述涉及到的知识点。下一节主要结合 PHP 介绍一下 socket 的相关函数。

相关文章
相关标签/搜索