介绍
感觉前面写得还是太冗长,废话有点多,离快速入门的目标还是有点远。所以文笔还需要再精炼。
既然是Java Web之路,前面讲的主要是如何使用Java语言及IDE工具Eclipse来开发我们的Java程序,现在我们开始把重点放在Web上。
计算机网络
首先,Web这个英文单词的含义就是:蜘蛛网,网状物。当然也就离不开计算机网络。
最早的计算机当然只是处理数据,并把结果打印出来即可。但现如今我们往往需要程序在不同计算机上进行数据的交换。比如,社交方面的聊天程序,我的计算机上运行的聊天程序需要能够把我的消息发送到你的计算机上运行的聊天程序。
并且,现在的计算机也泛指一切有计算芯片的设备,未来人类将在所有物体上嵌入芯片,这样就出现万物互联的网络,这就是所谓的物联网吧(英文是Internet of things,简称IoT)。
要形成计算机网络,在硬件上必须要有计算机和计算机之间的连接媒介(就是起到连接作用的东西),当然,中间还可能有网络设备来增强信号、决定消息的传输路径、拦截坏消息等等。媒介有有线和无线的,有线的就是常说的网线,无线的基本是通过电磁波传输消息。而计算机上用于发送和接收消息的设备就是俗称的网卡了。
不管是有线还是无线,消息先由设备转化为某种物理信号,比如电信号、光信号、电磁波等,然后通过媒介传输到接收设备,接收设备再将物理信号转化为数字信号。由于计算机采用二进制,所以这些数字信号都是0和1,存储在半导体芯片上。
现在的问题是,设备如何转换这些信号才能保证接收端能正确翻译出发送端的发出的消息?答案就是双方都遵守一定的协议(英文用单词protocol表示)。协议其实就是为保证消息的正确交换而建立的一种规则、标准或约定,相当于计算机的通信“语言”。
局域网
当然,协议有很多种。最早的时候,不同地方的人们只是将各自少量的计算机连接起来形成小范围的网络,这就是局域网(Local Area Network,简称LAN),也就开发出了各自不同的局域网协议:以太网、令牌环网、无线局域网等等。这些协议目前都由一个叫IEEE(电气和电子工程师协会,全称是Institute of Electrical and Electronics Engineers)的国际组织来维护。目前最流行的就是以太网和无线局域网了,所以经常看到的网线和网卡都是支持以太网协议或无线局域网协议的。具体的协议编号什么802.3之类的就不赘述了。
这些协议最重要的一个方面是需要给每一个网卡定一个唯一标识,这就是MAC地址(英文全称是Media Access Control Address),直译为媒体访问控制地址,也称为局域网地址(LAN Address),以太网地址(Ethernet Address)或物理地址(Physical Address))。发送端在消息里打上接收端的MAC地址,接收端收到消息后看是否是发给自己的,是则接收,否则抛弃。这就是协议中的寻址问题。
数据的传输就像自来水的传输一样,信号是不间断的,协议的作用就是把这些不间断的信号划分成一个一个小单元,每个单元都有一定格式,这样接收端才能理解和翻译成消息。在局域网里面消息是以帧(frame)为单位传输的,比如,以太网里面的一帧消息的格式是:
前导码 | 帧开始符 | MAC 目标地址 | MAC 源地址 | 802.1Q标签 (可选) | 以太类型 | 负载(就是真正的消息内容) | 冗余校验 | 帧间距 |
---|---|---|---|---|---|---|---|---|
7个字节 | 1个字节 | 6个字节 | 6个字节 | 4个字节 | 2个字节 | 46到1500个字节 | 4个字节 | 12个字节 |
网络层协议 - IP
后来,随着计算机的快速发展,这个局域网内的计算机需要发送消息给另一个局域网内的计算机,但是由于两个局域网的协议可能不一样,于是人们又开发出了网际协议(Internet Protocol,简称IP)。internet这个单词由词根inter(什么什么之间的)和net(网络)组成,本义就是网络之间的,就是在各个局域网之间的,所以这个协议就叫网际协议。网际协议又有很多,但最流行的就是IP协议(所以IP既是泛称又是特称),已经成为事实上的标准了。
目前所说的互联网(Internet)指的就是支持IP网络。本质上,它就是网络的网络。
这里,寻址问题再次出现,因为各个局域网协议的不同,它们的MAC地址格式也是不一样的,所以我们需要再次设计一种地址,用来标识设备在整个互联网中的唯一性,这就是IP地址(随着接入互联网的设备越来越多,原来设计的IP地址已经不够用了,所以又设计了IPv6,原来的就叫IPv4)。目前常用的IP地址就是IPv4的地址,它是4个字节的,人们常用点分十进制来书写和记忆,如:192.168.1.1。IP地址涉及到A类B类C类的分类、网段和子网掩码等等,都是为了有效的利用,因为IPv4地址也是一种有限的资源,会用尽。
那这个IP地址放在哪里呢?当然是放在局域网协议的消息帧里面,即在局域网消息帧的负载里面。
在IP网络里,消息也被切割成一个个单元,这些单元叫包(packet),IP数据包的格式也包含首部和负载,IPv4包的格式如下:
图片来源于互联网
路由器上有很多网卡,每个网卡连接一个局域网。从一个局域网收到消息后,拆开局域网帧,再拆开里面的IP包(这里,可能需要若干个局域网帧里面的IP包才能组装成一个IP包,因为IP包的数据负载较大),根据IP首部组装成IP包,然后再根据IP首部的目的IP地址和路由器的配置将该IP包转发到另一个局域网,这时又要将IP包重新拆分为若干个局域网帧。可见,路由器的IP包转发需要耗费一定时间。
当然,IP协议属于网络层,但网络层中还有ARP、ICMP、IPSec等协议,都是为了转换、控制和安全等需求。为了配合检测互联网中设备之间的网络连通性,人们开发了一个工具,叫Ping工具,除非防火墙禁用了这个工具,否则可以测出你的机器到目标机器的IP网络连通性,就是你的机器能不能发送IP包到目标机器。在Window操作系统里面,打开命令行,通常可以直接使用:
上图中,第一个命令ping的是自己,127.0.0.1是指本机,可以用来测试本机的网卡是否能用。第二个命令ping的是百度的机器,但用的是域名,可以看到本机与百度的机器是连通的,就是说我能够在本机发送IP包给百度的机器,也能收到百度的机器给我的IP包。
Ping是一个很有用的问题排查工具!很多时候需要先验证网络是否连通,只有网络连通了,然后才能进行问题的进一步排查。
传输层协议 - TCP
随着技术发展,操作系统可以并发的执行多个应用程序,这就带来一个问题,操作系统如何知道从网卡接收的IP数据包是哪个应用程序要用的呢(这叫数据的端到端传输)?于是人们在网络层协议的基础上又增加一层协议,就叫传输层协议,至于为什么叫传输层,可能是跟数据传输相关的需求有关吧,比如提供端到端的数据传输,流量控制、差错控制、丢失重传、乱序重组等等。
而TCP(英文全称是Transmission Control Protocol,直译为传输控制协议)就是其中一种传输层协议,其他的还有UDP(英文全称是User Datagram Protocol,直译为用户数据报协议)等等。
那么回到开头那个问题,本质上也是一个寻址问题,TCP里面设计的机制是使用一个2个字节的编号,这样应用程序运行的时候告诉操作系统,我占用了某个编号即可,这就是端口号。于是,计算机收到IP数据包之后,操作系统(实际上是网卡驱动吧?)继续拆开里面的TCP协议单元数据(这叫数据段,英文是Segment),然后根据里面的目的端口号就可以把数据放到相应的进程缓存空间里。所以一个端口号被用了的话,操作系统会不允许其他进程再占用这个端口号。
由此看来,协议的设计是一层一层的,每一层都是解决一类问题,数据链路层(物理层)是解决传输媒介的访问问题;网络层是解决各个局域网之间计算机的连通性问题;传输层是解决数据的端到端传输问题。不管是MAC帧,IP数据包,还是TCP数据段,都可以叫做报文。逻辑上看数据链路层处于最底层,然后一层一层往上设计,物理上看不过就是报文一层一层往里嵌套,不过每一层协议的报文数据容量都不一样,所以,上层的长报文要切割成合适的短报文再添加上下层的报文首部。硬件上,工作在不同层次的设备就表示能解析该层协议的数据报文。
TCP报文的格式是这样的:
图片来源于互联网
TCP内容还有很多,比如它是面向连接的,可靠的,三次握手建立连接,四次撒手释放连接,可靠性上采用超时重传和捎带确认机制,流量控制上采用滑动窗口协议,拥塞控制上采用TCP拥塞控制算法(也称AIMD算法)等等。
这里提一点就是,TCP连接并不是真的有某种连接,而是设计一种机制让两端能知道对端是活着的,表现为进程还在,端口处于打开状态,只有活着的才能传输数据。本质上就是心跳机制,每隔一段时间发送TCP心跳报文,看是否有确认报文回来。当然,操作系统要为维护这个连接分配CPU、内存和端口号等资源。
检查计算机上TCP端口号是否打开也有一个工具,就是Telnet,它也是一个很重要的问题排查工具!比如,检测本机80端口是否打开:
telnet 127.0.0.1 80
应用层协议
现在,消息能从一个计算机上的某个程序传输到另一个计算机上的某个程序,现在的问题是,这些程序怎么封装和解析消息呢?比如,聊天程序怎么判断是发送给某个好友呢,还是发送给某个群呢,它肯定得要设计一套协议来控制吧。这就是应用层协议。
顾名思义,应用层就是特定到人们使用的某个应用了。比如,用于邮件发送接收的SMTP、POP3、IMAP4;用于文件传输的FTP协议;用于远程控制的Telnet协议(就是上面的Telnet工具使用的协议);用于网页传输的HTTP协议(这个就是我们以后真正要开发的Web程序使用协议);用于域名解析的DNS协议等等。
后面我们涉及的主要就是HTTP协议。而现在的Web(全称是World Wide Web,音译为万维网,也有点意译的味道),其实就是指基于网页和HTTP的全球性的信息系统。
什么是Web开发?就是基于网页和HTTP的应用程序或应用系统的开发。我们后面就是要用Java语言来进行Web开发(所以,Web开发只是Java语言的其中一个领域,还可以用Java语言来做其他领域的事,比如数据分析、数据处理等等)。终于回到了Web这个正题上,实在不容易。可是为什么是网页和HTTP的基础上再做应用?而不是其他,肯定这种系统有着无可比拟的优势,这就不赘述了,反正现在是什么应用都建立在Web之上。
总结
又是洋洋洒洒写了一大堆,看来我的写作风格就是这样了,得看看有什么方法改进一下写作水平了。看来每个人都有自己的写作风格,难怪能那些红学家能判断出《红楼梦》后四十回不是曹雪芹写的。
- 存在即合理,事出有因。任何事物(包括技术)的出现都是需求驱动的,计算机网络,各种网络协议都是如此;
- IP协议用来解决网络节点的连通性,核心是IP地址;
- TCP协议用来解决网络节点的端到端数据传输,核心是TCP端口号,它是可靠的,面向连接的,即数据传输之前必须先建立连接;
- HTTP协议是基于TCP协议的;
- 什么是Web开发?就是基于网页和HTTP的应用程序或应用系统的开发。就是写一个程序,浏览器能向它请求网页,而网页的内容当然就是特定于你的应用了。HTTP请求的接收、网页的生成、HTTP响应的发送都是通用的,所以直接使用现成的Web服务器和网页模板就可以了,剩下的就是提供数据而已,即你的程序就是数据的工厂或搬运工。
- 标准很重要,它能保证产品的互联互通和互相替换。上述协议无一不是被某些组织标准化了,不过中国在这些标准上的发言权很小,没办法,这些技术最早都是由外国人研发的。可喜的是,华为在5G通信领域上迎头赶上,提出了众多的标准。标准可不是随口就能提的,你得证明你提的标准能行得通,能造出相应设备,还得没错才行,这都需要雄厚的技术功底;
- Ping和Telnet是很好用的工具,遇到网络问题,可以先尝试测试一下网络和端到端的连通性;
- 你可以设计你自己的应用层协议。