网络协议分层.docx
- 文档编号:9751778
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:25
- 大小:465.38KB
网络协议分层.docx
《网络协议分层.docx》由会员分享,可在线阅读,更多相关《网络协议分层.docx(25页珍藏版)》请在冰豆网上搜索。
网络协议分层
网络协议分层:
应用层:
只网络操作系统和具体的应用程序,对应WWW服务器,FTP服务器等应用软件
HTTP协议HyperTextTransferProtocol超文本传输协议用于WWW服务器传输超文本
FTP协议是TCP/IP协议组中的一个
SMTP协议简单邮件传输协议.用于邮件通信
表示层:
数据语法的转换,数据的传送等
会话层:
建立两端之间的会话关系,并负责数据的传送
传输层:
负责错误的检查与修复,以确保传送的质量,是TCP工作的地方
网络层:
提供了编址方案,IP协议工作的地方(数据包)
数据链路层:
将由物理层传来的未经处理的位数据包装成数据帧
物理层:
对应网线,网卡,接口等物理设备
TCP/IP协议栈
TransmissionControlProtocol/InternetProtocol的简写
应用层,传输层,IP网络层,网络接口层
高可靠的传输协议,发送包会确认后再发下一个,询问模式.
IP协议简介
IP是英文InternetProtocol的缩写,也就是为计算机网络互相链接进行通信而设计的协议,在因特网中,他是能是连接到网上的所有计算机相互通信的一套规则
Tcp协议与UDP协议的区别
TCP协议需要创建链接,UDP不需要
TCP是可靠的传输协议,UDP是不可靠的
TCP适合传输大量数据,UDP适合传输少量数据
TCP的速度慢,UDP速度快
1.网络基础
1.1.网络协议
1.1.1.网络协议分层
OSI(开放系统互联(OpenSystemInterconnection))模型是国际标准化组织ISO创立的。
这是一个理论模型,并无实际产品完全符合OSI模型。
制订OSI模型只是为了分析网络通讯方便而引进的一套理论。
也为以后制订实用协议或产品打下基础。
OSI模型共分七层:
从上至下依次是
图-1
应用层:
指网络操作系统和具体的应用程序,对应WWW服务器、FTP服务器等应用软件
表示层:
数据语法的转换、数据的传送等
会话层:
建立起两端之间的会话关系,并负责数据的传送
传输层:
负责错误的检查与修复,以确保传送的质量,是TCP工作的地方。
网络层:
提供了编址方案,IP协议工作的地方(数据包)
数据链路层:
将由物理层传来的未经处理的位数据包装成数据帧
物理层:
对应网线、网卡、接口等物理设备(位)
1.1.2.TCP/IP协议栈
TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议
由网络层的IP协议和传输层的TCP协议组成。
TCP/IP定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。
协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
通俗而言:
TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。
而IP是给因特网的每一台电脑规定一个地址。
TCP/IP协议栈(按TCP/IP参考模型划分),TCP/IP分为4层,不同于OSI,他将OSI中的会话层、表示层规划到应用层:
应用层,传输层,IP网络层,网络接口层
1.2.IP层协议
1.2.1.IP协议简介
IP是英文InternetProtocol(网络之间互连的协议)的缩写,也就是为计算机网络相互连接进行通信而设计的协议。
在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。
任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。
1.2.2.路由器简介
路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。
当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。
因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互连环境中,建立灵活的连接,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。
1.2.3.IP地址及其含义
互联网协议地址(InternetProtocolAddress,又译为网际协议地址),缩写为IP地址(IPAddress)。
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。
IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。
例:
点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。
1.3.传输层协议
1.3.1.TCP协议简介
TCP(TransmissionControlProtocol)和UDP(UserDatagramProtocol)协议属于传输层协议。
其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。
通过面向连接、端到端和可靠的数据包发送。
“面向连接”就是在正式通信前必须要与对方建立起连接。
比如你给别人打电话,必须等线路接通了、对方拿起话筒才能相互通话。
1.3.2.UDP协议简介
UDP是UserDatagramProtocol的简称,中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
是与TCP相对应的协议。
它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
1.3.3.端口号的概念
一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。
一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务通过1个IP地址来实现。
通过“IP地址+端口号”来区分不同的服务的。
不同的协议间端口不冲突。
比如我们可以同时使用UDP打开8088端口的与TCP的8088端口。
1.3.4.TCP协议与UDP协议的区别
TCP协议需要创建连接,而UDP协议则不需要。
TCP是可靠的传输协议,而UDP是不可靠的。
TCP适合传输大量的数据,而UDP适合传输少量数据。
TCP的速度慢,而UDP的速度快。
1.4.应用层协议
1.4.1.HTTP协议简介
HTTP协议(HyperTextTransferProtocol,超文本转移协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。
它可以使浏览器更加高效,使网络传输减少。
它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。
HTTP是一个无状态的协议。
1.4.2.FTP协议简介
FTP是TCP/IP协议组中的协议之一,是英文FileTransferProtocol的缩写。
该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。
1.4.3.SMTP协议简介
SMTP(SimpleMailTransferProtocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。
SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。
2.TCP通信
2.1.Socket原理
2.1.1.Socket简介
socket通常称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
Socket和ServerSocket类库位于java.net包中。
ServerSocket用于服务端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
2.1.2.获取本地地址和端口号
.Socket为套接字类,其提供了很多方法,其中我们可以通过Socket获取本地的地址以及端口号。
1. intgetLocalPort()
该方法用于获取本地使用的端口号
1. InetAddressgetLocalAddress()
该方法用于获取套接字绑定的本地地址
使用InetAddress获取本地的地址方法:
1. StringgetCanonicalHostName()
获取此IP地址的完全限定域名。
1. StringgetHostAddress()
返回IP地址字符串(以文本表现形式)。
代码如下:
1. publicvoidtestSocket()throwsException{
2. Socketsocket=newSocket("localhost",8088);
3. InetAddressadd=socket.getLocalAddress();//获取本地地址信息
4. System.out.println(add.getCanonicalHostName());
5. System.out.println(add.getHostAddress());
6. System.out.println(socket.getLocalPort());
7. }
2.1.3.获取远端地址和端口号
Socket也提供了获取远端的地址以及端口号的方法:
1. intgetPort()
该方法用于获取远端使用的端口号。
1. InetAddress.getInetAddress()
该方法用于获取套接字绑定的远端地址。
代码如下:
1. publicvoidtestSocket()throwsException{
2. Socketsocket=newSocket("localhost",8088);
3. InetAddressinetAdd=socket.getInetAddress();
4. System.out.println(inetAdd.getCanonicalHostName());
5. System.out.println(inetAdd.getHostAddress());
6. System.out.println(socket.getPort());
7. }
2.1.4.获取网络输入流和网络输出流
通过Socket获取输入流与输出流,这两个方法是使用Socket通讯的关键方法。
封装了TCP协议的Socket是基于流进行通讯的,所以我们在创建了双方连接后,只需要获取相应的输入与输出流即可实现通讯。
1. InputStreamgetInputStream()
该方法用于返回此套接字的输入流。
1. OutputStream.getOutputStream()
该方法用于返回此套接字的输出流。
代码如下:
1. publicvoidtestSocket()throwsException{
2. Socketsocket=newSocket("localhost",8088);
3. InputStreamin=socket.getInputStream();
4. OutputStreamout=socket.getOutputStream();
5. }
2.1.5.close方法
当使用Socket进行通讯完毕后,要关闭Socket以释放系统资源。
1. voidclose()
当关闭了该套接字后也会同时关闭由此获取的输入流与输出流。
2.2.Socket通讯模型
2.2.1.Server端ServerSocket监听
.ServerSocket是运行于服务端应用程序中。
通常创建ServerSocket需要指定服务端口号,之后监听Socket的连接。
监听方法为:
1. Socketaccept()
该方法是一个阻塞方法,直到一个客户端通过Socket连接后,accept会封装一个Socket,该Socket封装与表示该客户端的有关的信息。
通过这个Socket与该客户端进行通信。
代码如下:
1. …
2. //创建ServerSocket并申请服务端口8088
3. ServerSocketserver=newServerSocket(8088);
4. /*方法会产生阻塞,直到某个Socket连接,并返回请求连接的Socket*/
5. Socketsocket=server.accept();
6. …
2.2.2.Client端Socket连接
通过上一节我们已经知道,当服务端ServerSocket调用accept方法阻塞等待客户端连接后,我们可以通过在客户端应用程序中创建Socket来向服务端发起连接。
需要注意的是,创建Socket的同时就发起连接,若连接异常会抛出异常。
我们通常创建Socket时会传入服务端的地址以及端口号。
代码如下:
1. //参数1:
服务端的IP地址,参数2:
服务端的服务端口
2. Socketsocket=newSocket(“localhost”,8088);
3. …
2.2.3.C-S端通信模型
C-S的全称为(Client-Server):
客户端-服务器端
客户端与服务端通信模型如下:
图-2
1.服务端创建ServerSocket
2.通过调用ServerSocket的accept方法监听客户端的连接
3.客户端创建Socket并指定服务端的地址以及端口来建立与服务端的连接
4.当服务端accept发现客户端连接后,获取对应该客户端的Socket
5.双方通过Socket分别获取对应的输入与输出流进行数据通讯
6.通讯结束后关闭连接。
代码如下:
1. /**
2. * Server端应用程序
3. */
4. publicclassServer{
5. publicstaticvoidmain(String[]args){
6. ServerSocketserver=null;
7. try{
8. //创建ServerSocket并申请服务端口为8088
9. server=newServerSocket(8088);
10.
11. //侦听客户端的连接
12. Socketsocket=server.accept();
13.
14. //客户端连接后,通过该Socket与客户端交互
15. //获取输入流,用于读取客户端发送过来的消息
16. InputStreamin=socket.getInputStream();
17. BufferedReaderreader
18. =newBufferedReader(
19. newInputStreamReader(
20. in,"UTF-8"
21. )
22. );
23.
24. //获取输出流,用于向该客户端发送消息
25. OutputStreamout=socket.getOutputStream();
26. PrintWriterwriter
27. =newPrintWriter(
28. newOutputStreamWriter(
29. out,"UTF-8"
30. ),true
31. );
32.
33. //读取客户端发送的消息
34. Stringmessage=reader.readLine();
35. System.out.println("客户端说:
"+message);
36.
37. //向客户端发送消息
38. writer.println("你好客户端!
");
39. }catch(Exceptione){
40. e.printStackTrace();
41. }finally{
42. if(server!
=null){
43. try{
44. server.close();
45. }catch(IOExceptione){
46. }
47. }
48. }
49. }
50.}
51.
52./**
53.*Client端应用程序
54.*/
55.publicclassClient{
56. publicstaticvoidmain(String[]args){
57. Socketsocket=null;
58. try{
59. socket=newSocket("localhost",8088);
60. //获取输入流,用于读取来自服务端的消息
61. InputStreamin=socket.getInputStream();
62. BufferedReaderreader
63. =newBufferedReader(
64. newInputStreamReader(
65. in,"UTF-8"
66. )
67. );
68.
69. //获取输出流,用于向服务端发送消息
70. OutputStreamout
71. =socket.getOutputStream();
72. OutputStreamWriterosw
73. =newOutputStreamWriter(out,"UTF-8");
74. PrintWriterwriter
75. =newPrintWriter(osw,true);
76.
77. //向服务端发送一个字符串
78. writer.println("你好服务器!
");
79.
80. //读取来自客户端发送的消息
81. Stringmessage=reader.readLine();
82. System.out.println("服务器说:
"+message);
83. }catch(Exceptione){
84. e.printStackTrace();
85. }finally{
86. try{
87. if(socket!
=null){
88. //关闭Socket
89. socket.close();
90. }
91. }catch(IOExceptione){
92. e.printStackTrace();
93. }
94. }
95. }
96.}
2.2.4.Server端多线程模型
通过上一节我们已经知道了如何使用ServerSocket与Socket进行通讯了,但是这里存在着一个问题,就是只能“p2p”点对点。
一个服务端对一个客户端。
若我们想让一个服务端可以同时支持多个客户端应该怎么做呢?
这时我们需要分析之前的代码。
我们可以看到,当服务端的ServerSocket通过accept方法侦听到一个客户端Socket连接后,就获取该Socket并与该客户端通过流进行双方的通讯了,这里的问题在于,只有不断的调用accept方法,我们才能侦听到不同客户端的连接。
但是若我们循环侦听客户端的连接,又无暇顾及与连接上的客户端交互,这时我们需要做的事情就是并发。
我们可以创建一个线程类ClientHa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 协议 分层