沟通是如何发生的
为了更加进一步的回答这个问题:
从输入网址到出现网页到底发生了什么?
我们需要知道设备和设备之间是如何实现沟通的。
也许从大家连接互联网开始也许就非常好奇这个问题。
这节我们来讲讲这个问题。
首先明确两个概念
设备:所有连接互联网的设备,包括 手机,电脑,平板等等
沟通:设备间的数据交换
在我们的计算机世界中,我们将数据的传输限制在OSI模型下。
OSI(Open System Interconnect),即开放式系统互联。
一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型。该体系结构标准定义了网络互联的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),即OSI开放系统互连参考模型。在这一框架下进一步详细规定了每一层的功能,以实现开放系统环境中的互连性、互操作性和应用的可移植性。
当然,现在存在另外一种更加简单的数据传输模型(自底向上)分别是:
1、物理层
2、数据链路层
3、网络层
4、运输层
5、应用层
举个简单的例子让大家了解这五个层次。
我电脑连接了网线,然后访问一个网站的时候。
1、网线作为物理层进行沟通(现代网线中传输的是光信号)
2、光信号存在波动,根据波动,数据链路层将光信号处理成0和1组成的序列
3、然后在网络层中,我们将0101组成的序列包装成一个个的数据包便于运输
4、在运输层中,我们进行真实的通讯。
5、应用层就是我们使用的网站本身,我们通过运输层的数据,进行功能实现。
举个例子。我们(在应用层)输入网址,浏览器调用运输层进行通讯。
运输层的通过运输层的协议TCP或UDP来将自己要发送的数据发送给对方。
使用TCP或UDP发送数据的时候将自己要发送的数据封装成一个个的包,通过网络层进行传输
而网络层又将数据通过一定的换算规则解析成010101最后01组成的数据在物理层被转化成不一样的光信号通过网线到达对方的设备,对方又通过上述的转化在运输层获得数据。
然后对方也通过http协议在(应用层)理解了你数据的含义。
之后又通过运输层发送了数据给你,你经过上述的操作
从而在运输层获得数据。然后在应用层将数据转化成好看的界面进行显示。
其实作为互联网的使用者,我们不需要实现网络层、运输层、应用层,我们只需要从抽象角度了解这一切即可。因为这个是通讯专业的人需要掌握的知识。
但我们需要知道的是:运输层的调用。
基本上所有的编程语言都支持socket,而socket就是一种对运输层的调用。
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
运输层有两个协议TCP和UDP,他们的底层都是使用一个个的数据包(package)在网络层发送数据。他们的存在一定的区别,但本质是一致的。为了后面讲解的需要,我们使用TCP协议来简单实现一次数据交互。
我们使用PHP这个语言实现网络通讯。
刚才我们说了,设备和设备之间的交流是需要IP号的,但是默认大家只有一台电脑。
我们现在只有一台电脑,一个IP号,我们怎么交流?
在互联网中,我们规定 127.0.0.1 是和自己沟通的IP。所有的运输层协议在发现:填写的IP号是127.0.0.1时将不会把数据发送到其他设备,而是发送给自己的设备本身。
明确了这一点之后,离沟通还差一步。
不知道大家有没有想过一个问题,
大部分情况下,我们的电脑上开启着 浏览器,QQ等至少两个软件。
使用浏览器发出数据的的请求之后,对方设备返回给我数据,为什么我的浏览器可以恰好的获得数据并且展示出界面呢?为什么不是QQ获得了数据并展示出界面呢?
要知道,QQ和浏览器都运行在我的电脑上,这两个软件此时在互联网上的IP号是相同的。
这就要引出下一个概念了。
端口
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。
我们的电脑上存在各种各样的端口。每当我们运行一个软件的时候,这个软件会调用一个运输层协议和别的设备(服务器)进行沟通。这个运输层协议会占用我们电脑一个端口。而对方电脑上也存在一个“软件”和我们沟通,这个软件也占用一个端口。
所有当我们使用正确的IP之后还得使用正确的端口,才能唯一地识别一个设备通过互联网和设备上的唯一软件从而进行沟通获得我们想要的数据。
大家对软件的理解也许存在偏差,这里简单解释一下,只要是通过语言编写的具备一定功能的代码,都可以称作软件。
真正的沟通
服务器端代码如下:
<?php
$socket =stream_socket_server ("tcp://127.0.0.1:7273",$error,$errorMsg);
if(!$socket)
{
echo "Errormsg:".$errorMsg;
}
else
{
echo "服务器启动。。。.";
for(;;)
{
$client=stream_socket_accept($socket,-1);//最大阻塞时间MAX
if($client)
{
$data=fread($client,1024);
echo $data;
fwrite($client,$data);
}
fclose($client);
}
fclose($socket);
}
?>
客户端代码如下:
<?php
$connet=stream_socket_client("tcp://127.0.0.1:7273",$error,$errorMmg,5);//参数4表示NAX超时时间
if(!$connet)
{
echo "Errormsg:".$errorMsg;
}
else
{
stream_socket_sendto($connet,"你好22!!!\n");//第二个参数
echo stream_get_contents($connet);
fclose($connet);
}
?>
将上面两端代码保存成两个.php后缀的文件。
在命令行下,先执行服务器端代码,再执行客户端代码。
你会看到执行的效果
本代码实现的效果是,不论客户端发送给服务器什么数据,服务器原样返回。
代码是学习的最佳方法。
也许你觉得上面的代码一行也看不懂。
但是说句实话,这个代码是目前能写出的最简单的socket代码。
通过百度各个函数,我觉得你能看懂到这个代码。
如果看懂了。我们看来看下一节。
继续探求这个问题:
从输入网址到出现网页到底发生了什么?
从输入网址到出现网页到底发生了什么?(四)
其他帮助:
PHP命令行执行文件
http://wemedia.ifeng.com/84035779/wemedia.shtml