您的位置:首页 > 其它

OSI协议与UDP操作

2011-09-15 23:57 127 查看
计算机网络中的七层协议:

  OSI是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。

7层及其功能:

  OSI的7层从上到下分别是

  7 应用层

  6 表示层

  5 会话层

  4 传输层

  3 网络层

  2 数据链路层

1 物理层

  其中高层,既7、6、5、4层定义了应用程序的功能,下面3层,既3、2、1层主要面向通过网络的端到端的数据流。下面我给大家介绍一下这7层的功能:

  (1)应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的子处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等。

  (2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。

  (3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。

  (4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。

  (5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。

  (6)数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。

  (7)物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。

java UDP 操作

1 DatagramSocket 类

要收发DatagramPacket必须打开一个数据报socket ,当服务器构造DatagramSocket时。

1.1 服务器和客户端的服务器

两者使用的socket都是一样的,区别仅仅在于 服务器端的端口是已知端口,而客户端的端口是系统分配的。

TCP端口和UDP端口之间没有关联,所以两者可以共同绑定在同一个端口上,而不会有相互影响。

1.2 DatagramSocket 类的构造函数

DatagramSocket创建一个在指定端口监听的入站数据报的 socket ,使用此构造函数可以编写出在指导的端口监听的服务器。

如果服务器在匿名端口监听,客户端就无法与之联系。

DatagramSocket 中的receive 方法,是阻塞方法,只有当接收到数据的时候,才会进行下面的代码,否则只会阻塞当前的进程。

1.3 一个简单的UDP 客户端

客户端接收用户在控制台上的输入,然后调用 DatagramSocket 中的send方法, 将数据传递出去。

import java.io.*;

import java.net*;

public class UDPDiscardClient extends Thread {

public final static int DEFAULT_PORT = 3000;

public UDPDiscardClient() {

start();

}

public void run() {

String hostname = "localhost";

int port = DEFAULT_PORT;

try {

InetAddress server = InetAddress.getByName(hostname);

BufferedReader userInput = new BufferedReader(

new InputStreamReader(System.in));

DatagramSocket theSocket = new DatagramSocket();

while (true) {

String theLine = userInput.readLine();

if (theLine.equals("."))

break;

byte[] data = theLine.getBytes("UTF-8");

DatagramPacket theOutput = new DatagramPacket(data,

data.length, server, port);

theSocket.send(theOutput);

}

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SocketException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}}

public static void main(String[] args) {

new UDPDiscardClient();

}}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: