网络协议分层Word文档下载推荐.docx
- 文档编号:5205561
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:25
- 大小:465.38KB
网络协议分层Word文档下载推荐.docx
《网络协议分层Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《网络协议分层Word文档下载推荐.docx(25页珍藏版)》请在冰点文库上搜索。
也为以后制订实用协议或产品打下基础。
OSI模型共分七层:
从上至下依次是
图-1
应用层:
指网络操作系统和具体的应用程序,对应WWW服务器、FTP服务器等应用软件
表示层:
数据语法的转换、数据的传送等
会话层:
建立起两端之间的会话关系,并负责数据的传送
传输层:
负责错误的检查与修复,以确保传送的质量,是TCP工作的地方。
网络层:
数据链路层:
物理层:
对应网线、网卡、接口等物理设备(位)
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()
该方法用于获取本地使用的端口号
InetAddressgetLocalAddress()
该方法用于获取套接字绑定的本地地址
使用InetAddress获取本地的地址方法:
StringgetCanonicalHostName()
获取此IP地址的完全限定域名。
StringgetHostAddress()
返回IP地址字符串(以文本表现形式)。
代码如下:
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也提供了获取远端的地址以及端口号的方法:
intgetPort()
该方法用于获取远端使用的端口号。
InetAddress.getInetAddress()
该方法用于获取套接字绑定的远端地址。
InetAddressinetAdd=socket.getInetAddress();
System.out.println(inetAdd.getCanonicalHostName());
System.out.println(inetAdd.getHostAddress());
System.out.println(socket.getPort());
2.1.4.获取网络输入流和网络输出流
通过Socket获取输入流与输出流,这两个方法是使用Socket通讯的关键方法。
封装了TCP协议的Socket是基于流进行通讯的,所以我们在创建了双方连接后,只需要获取相应的输入与输出流即可实现通讯。
InputStreamgetInputStream()
该方法用于返回此套接字的输入流。
OutputStream.getOutputStream()
该方法用于返回此套接字的输出流。
代码如下:
InputStreamin=socket.getInputStream();
OutputStreamout=socket.getOutputStream();
2.1.5.close方法
当使用Socket进行通讯完毕后,要关闭Socket以释放系统资源。
voidclose()
当关闭了该套接字后也会同时关闭由此获取的输入流与输出流。
2.2.Socket通讯模型
2.2.1.Server端ServerSocket监听
.ServerSocket是运行于服务端应用程序中。
通常创建ServerSocket需要指定服务端口号,之后监听Socket的连接。
监听方法为:
Socketaccept()
该方法是一个阻塞方法,直到一个客户端通过Socket连接后,accept会封装一个Socket,该Socket封装与表示该客户端的有关的信息。
通过这个Socket与该客户端进行通信。
…
//创建ServerSocket并申请服务端口8088
ServerSocketserver=newServerSocket(8088);
/*方法会产生阻塞,直到某个Socket连接,并返回请求连接的Socket*/
Socketsocket=server.accept();
2.2.2.Client端Socket连接
通过上一节我们已经知道,当服务端ServerSocket调用accept方法阻塞等待客户端连接后,我们可以通过在客户端应用程序中创建Socket来向服务端发起连接。
需要注意的是,创建Socket的同时就发起连接,若连接异常会抛出异常。
我们通常创建Socket时会传入服务端的地址以及端口号。
//参数1:
服务端的IP地址,参数2:
服务端的服务端口
Socketsocket=newSocket(“localhost”,8088);
2.2.3.C-S端通信模型
C-S的全称为(Client-Server):
客户端-服务器端
客户端与服务端通信模型如下:
图-2
1.服务端创建ServerSocket
2.通过调用ServerSocket的accept方法监听客户端的连接
3.客户端创建Socket并指定服务端的地址以及端口来建立与服务端的连接
4.当服务端accept发现客户端连接后,获取对应该客户端的Socket
5.双方通过Socket分别获取对应的输入与输出流进行数据通讯
6.通讯结束后关闭连接。
/**
*
Server端应用程序
*/
publicclassServer{
publicstaticvoidmain(String[]args){
ServerSocketserver=null;
try{
8.
//创建ServerSocket并申请服务端口为8088
9.
server=newServerSocket(8088);
10.
11.
//侦听客户端的连接
12.
13.
14.
//客户端连接后,通过该Socket与客户端交互
15.
//获取输入流,用于读取客户端发送过来的消息
16.
17.
BufferedReaderreader
18.
=newBufferedReader(
19.
newInputStreamReader(
20.
in,"
UTF-8"
21.
)
22.
);
23.
24.
//获取输出流,用于向该客户端发送消息
25.
26.
PrintWriterwriter
27.
=newPrintWriter(
28.
newOutputStreamWriter(
29.
out,"
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.
44.
server.close();
45.
}catch(IOExceptione){
46.
}
47.
48.
49.
50.}
51.
52./**
53.*Client端应用程序
54.*/
55.publicclassClient{
56.
57.
Socketsocket=null;
58.
59.
socket=newSocket("
60.
//获取输入流,用于读取来自服务端的消息
61.
62.
63.
64.
65.
66.
67.
68.
69.
//获取输出流,用于向服务端发送消息
70.
OutputStreamout
71.
=socket.getOutputStream();
72.
OutputStreamWriterosw
73.
=newOutputStreamWriter(out,"
74.
75.
=newPrintWriter(osw,true);
76.
77.
//向服务端发送一个字符串
78.
你好服务器!
79.
80.
//读取来自客户端发送的消息
81.
82.
服务器说:
83.
84.
85.
86.
87.
if(socket!
88.
//关闭Socket
89.
socket.close();
90.
91.
92.
93.
94.
95.
96.}
2.2.4.Server端多线程模型
通过上一节我们已经知道了如何使用ServerSocket与Socket进行通讯了,但是这里存在着一个问题,就是只能“p2p”点对点。
一个服务端对一个客户端。
若我们想让一个服务端可以同时支持多个客户端应该怎么做呢?
这时我们需要分析之前的代码。
我们可以看到,当服务端的ServerSocket通过accept方法侦听到一个客户端Socket连接后,就获取该Socket并与该客户端通过流进行双方的通讯了,这里的问题在于,只有不断的调用accept方法,我们才能侦听到不同客户端的连接。
但是若我们循环侦听客户端的连接,又无暇顾及与连接上的客户端交互,这时我们需要做的事情就是并发。
我们可以创建一个线程类ClientHa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 协议 分层