网络编程
初学者应注意,我们搭建网站是为了进行网络通信的,那么java网络通信需要遵循什么协议呢。
在此之前我们需要先了解一个名词——OSI模型,它是一种概念模型,国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。
1.协议
OSI七层网络模型(从下往上):
- 物理层(从物理器件到局部局域网上传数据)
- 数据链路层(主要负责网络寻址)
- 网络层(决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成分组。IP协议就在这层)
- 传输层(把传输表头加至数据以形成数据报。传输表头包含了所使用的协议等发送信息。TCP、UDP协议就在这层)
- 会话层(两台计算机间建立的通信连接)
- 表达层(数据格式转换)
- 应用层(提供为应用软件而设的接口,以设置与另一应用软件之间的通信。HTTP,FTP,SMTP等就在这层)
TCP/IP四层模型:
以上两种模型,TCP/IP是在Internet网络不断发展的过程中建立的,基于时间,有很高的信任度。而OSI则是一种理论上的模型。
也就是说我们在网络通信中,是经历了这么多层才完成的。IP协议层只是完成了网络联通的工作,TCP、UDP协议只是完成了数据的传输工作,HTTP、HTTPS等协议只是完成了应用程序间沟通交互的工作。
TCP/IP概念:TCP/IP是一个协议簇,里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议, 因为TCP,IP协议是两个很重要的协议,就用它两命名了。
2.DNS
在网络层(也就是IP协议层)还有一个需要我们注意的点——DNS,有些初学者在学有小成后会想要搭建一个自己的网站,但是我们会发现,在租购服务器后,我们仅仅能够看到服务器在网络中的ip地址,我们需要购买相应的域名,将域名与ip地址绑定,也就是将域名和IP地址相互映射,这就是DNS的工作范畴。
让我们看一下我们访问网址时,电脑都做了什么:
- 如果你的电脑配置了Host文件,电脑会优先查询Host文件是否有对应的记录,如果有,直接拿到该记录的IP就结束。
- 如果Hsot文件没有该记录,电脑会看是否设置域名服务器。
2.1 如果没有设置的话,浏览器会直接报错,域名无法解析。
2.2 如果设置了,电脑会向该域名服务器发送域名查询的请求,等待域名服务器的响应。
2.2.1 如果无回应,域名还是无法解析。
2.2.2 如果回应了,可以根据根据域名服务器的应答信息,得到该ip地址。
所以,通常我们在访问网站时,先去的是域名服务器,用我们输入的网址兑换出来相应的数字ip地址,然后才是去访问这个ip地址的。
网络地址是找到了,但是应用程序呢,电脑上有很多应用程序的,我们仅仅通过ip并不能知道我们要访问的是电脑上的哪一个程序。端口出现了:
- 用于区分不同的应用程序
- 端口号的范围为0-65535,其中0-1023未系统的保留端口,我们的程序尽可能别使用这些端口!
- IP地址和端口号组成了Socket,Socket是网络运行程序间双向通信链路的终结点, 是TCP和UDP的基础!
- 常用协议使用的端口:HTTP:80,FTP:21,TELNET:23
3.套接字
套接字(Socket)是TCP/IP网络通信的基本操作单元。不同主机间的双向通信端点,某程序将一段数据写入套接字中,该套接字就会将该数据发送给另一个与之通信的另外一个套接字,就像电话线一样。当然,这一过程所经历的,就是本篇文章一开始讲的那个TCP/IP四层模型。
socket套接字连接的建立过程:服务器监听、客户端请求、连接确认。
4.TCP协议
它是属于数据传输层的。通过Socket套接字建立连接,再通过socket发送/接收数据。
特点:数据传输因建立了连接而显得更为安全可靠,缺点也同样因为连接的建立而产生了过大的开销。
三次握手建立连接:
四次挥手终止连接(终止需要两个端分别主动挥手一次)
5.UDP协议
UDP协议也属于数据传输层,它是不可靠的网络协议,之所以不可靠,是因为他的通信不会建立连接,这可能会导致丢失数据包。但是! 正因为不建立连接,它的开销会很小,通常用在视频、语音、游戏等场景,这些场景丢包也不会影响全局。
6.HTTP协议
HTTP协议属于应用层。它被设计用于Web浏览器和Web服务器之间的通信,但它也可以用于其他目的。
由这个流程图我们可以看出,HTTP协议是给web浏览器和服务器端看的,浏览器采用这个协议去解析数据,然后再采用TCP协议来建立连接传输数据等。
类似于:应用层(浏览器端)>主机到网络层(物理层)>网络连接层(IP)>数据传输层>应用层(服务器端)
Servlet
初学者注意,重点来了!!!
Servlet是Java应用程序,它由Web服务器进行加载。
上面我们已经说到了,网站应用层大部分使用的是HTTP、HTTPS协议,而这些协议是作用在web浏览器和web服务器上的(web服务器与HTTP协议相匹配),servlet又是由web服务器加载的。所以通信采用HTTP协议能够与web服务器交流,web服务器再与内部加载的servlet交流,进而就进入了我们的java程序。当然servlet的运行需要java虚拟机的支持。
servlet与socket:socket的作用是数据传输io,而servlet在此基础上增加了协议支持。servlet可以看做是web容器运行的一部分逻辑(请求和响应,执行完servlet.service方法后,由容器传递给socket类的outputstream,完成相关操作)。也就是说我们在应用层使用的是servlet,之后web容器还是会在基础层级去使用socket套接字的。
Servlet声明周期:首先加载servlet的class,实例化servlet,然后初始化servlet调用init()的方法,接着调用服务的service的方法处理doGet和doPost方法,最后容器关闭时候调用destroy 销毁方法。
- init(); //仅执行一次,在服务器载入servlet时执行或第一次访问时执行,servlet是由容器(如tomcat)创建的
- service(); //Servlet每次处理请求时都会调用service()方法,内部会调用相应的doGet(); doPost();等,所以在我们覆写时通常覆写的都是这两个方法
- destroy(); //仅执行一次,在服务器卸装servlet时执行
服务器每次收到对servlet的请求都会产生一个新的线程,调用service()方法。