摘要
网络层协议的三要素:目的、方式、顺序。互联网OSI七层模型,把通讯协议分为七层,从物理层到应用层,每层都有自己的任务,像一座高塔,层层递进,才能构建起完美的网络世界。
正文
词义表明要干什么,英语的语法表明要怎么做,时钟频率表明做的次序。
2.互联网OSI七层模型
OSI/RM 实体模型(Open System Interconnection/Reference Model)。它将电子计算机七层协议的通讯协议区划为七层,由上而下先后为物理层(Physics Layer)、数据链路层(Data Link Layer)、传输层(Network Layer)、网络层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、网络层(Application Layer)。
3.TCP四层实体模型介绍
由上而下先后为网线端口层(Network Interface Layer)、传输层(Network Layer)、网络层(Transport Layer)和网络层(Application Layer)。
还能够变换为五层实体模型,将要网线端口层分成物理层和数据链路层。
3.1TCP四层功效
物理层要求了物理介质的各种各样特点,包含机械设备特点、电子器件特点、作用特点和技术规范特点。
数据链路层承担接受数据帧并根据互联网推送,或从互联网上接受物理学帧再抽身出数据帧交到传输层。
传输层管理中的数据通讯,想方设法将数据信息从源端历经多个正中间连接点传输到目地端,进而向网络层给予最基本上的端到端的数据信息传输服务项目。
网络层关键作用包含切分和资产重组数据信息并给予差错控制和流量监控,以做到给予靠谱传送的目地。为了更好地完成靠谱的传送,网络层协议书要求协调器务必推送确定信息内容以明确数据信息做到,倘若内容丢失,务必再次推送。
网络层相匹配于 OSI 七层模型的会话层、表示层和网络层,该层向客户给予一组常见的应用软件服务项目。
3.2网络层的常见协议书
1.传输控制协议(Transmission Control Protocol,TCP),是一种靠谱的朝向联接的传输技术协议书。在 TCP/IP 协议书族中,TCP 给予靠谱的联接服务项目,选用“三次握手”创建一个联接。
2.客户数据信息报协议书(User Datagram Protocol,UDP),是此外一个关键的协议书,它给予的是无联接、朝向事务管理的简易不靠谱信息内容传输服务项目。UDP 不给予切分、资产重组数据信息和对数据信息开展排列的作用,换句话说,当数据信息推送以后,没法获知其是不是能安全性详细地抵达。
UDP是无联接的、不靠谱的,資源耗费小,响应速度快,可是在网络不稳定的状况下丢包率较为严重。
3.3网络层的常见协议书
-
文件传送协议书(File Transfer Protocol,FTP),提交、下载文件能够应用 FTP 服务项目。
-
Telnet 协议书,给予客户远程登陆的服务项目,应用佳明运动手表传输,安全性差,但简易便捷。
-
解析域名服务项目(Domain Name Service,DNS),给予网站域名和 IP 详细地址中间的分析变换。
-
简易电子邮件传输协议(Simple Mail Transfer Protocol,SMTP),用于操纵电子邮件的推送、转站。
-
HTML文件传输协议(Hypertext Transfer Protocol,HTTP),用以完成互联网技术中的 WWW 服务项目。
-
邮政局协议书的第三个版本号(Post Office Protocol 3,POP3),它是要求pc机如何连接到互联网技术上的邮箱服务器开展收取和发送电子邮件的协议书。
3.4数据信息的封裝与解封
从上到下,数据信息的传送必须再加上相对应的头顶部和尾端,称之为数据信息的封裝。
由下向上,数据信息的传送必须除掉相对应的头顶部和尾端,称之为数据信息的解封。
4 IP地址以及表明
IP地址由两一部分构成:网络号和服务器号
网络号表明该详细地址处在哪一个互联网,服务器号表明该详细地址的服务器。
IP 详细地址有二种表明方法,二进制表明和点分十进制表明,普遍的是点分十进制表明的 IP 详细地址。IP 详细地址的长短为 32 位,每 8 位构成一个一部分,一个 IP 详细地址能够分成四个一部分。假如每一个一部分用十进制表明,其值的范畴为 0 ~ 255,不一样一部分中间用“.”切分起来。
5 网站域名介绍以及归类
网站域名可分成不一样等级,包含顶级域名、二级域名等。
顶级域名又可分成下列两大类:
一类是我国顶级域名,200 好几个我国都依照 ISO3166 国家代码分派了顶级域名,比如中国是 cn,英国是 us,韩是 kr 等。
另一类是国际性顶级域名,一般表明着申请注册企业类别的标记,比如表明商事主体的 com,表明互联网服务提供商的 net,表明非营利性组织的 org 等。
二级域名就是指顶级域名下的网站域名,比如在国际性顶级域名下,由注册域名人申请办理申请注册的在网上名字,比如 sohu、apple、microsoft 等。
6 InetAddress——获得IP地址
-
InetAddress[] getAllByName(String host)
:根据IP地址和配备名回到IP地址。 -
InetAddress getByAddress(byte[] addr)
:根据 IP 详细地址二维数组回到InetAddress
目标。 -
InetAddress getByAddress(String host, byte[] addr)
:依据给予的IP地址 host 和字节数二维数组方式的 IP 详细地址 addr,建立InetAddress
目标。 -
InetAddress getByName(String host)
:给出IP地址 host,回到InetAddress
目标。 -
InetAddress getLocalHost()
:回到当地服务器InetAddress
目标。
InetAddress
类的别的常见方式 有下列几类:
-
byte[] getAddress()
:回到此InetAddress
目标的 IP 详细地址二维数组。 -
String getCanonicalHostName()
:回到此 IP 详细地址的彻底限制网站域名。彻底限制域名是指IP地址再加上全途径,全途径中列举了编码序列中全部域组员。 -
String getHostAddress()
:回到 IP 详细地址字符串数组。 -
String getHostName()
:回到此 IP 详细地址的IP地址。
7 URL类——获得互联网资源的部位
构造函数:URL(详细地址)
获得网页页面的键入字节流:url.openStream()
应用IO方式 对网页页面的內容开展获得和分析
8 URLConnection类——联接通讯
1.使用url.openConnection()获得联接目标。
2.设定主要参数和一般要求特性。
3.应用connect()方式 开展远程桌面连接。
8.1 URLConnection的实际特性
-
boolean doInput
:将doInput
标示设定为 true,标示应用软件要从 URL 联接获取数据,此特性的初始值为 true。此特性由setDoInput()
方式 设定,其值由getDoInput()
方式 回到。 -
boolean doOutput
:将doOutput
标示设定为 true,标示应用软件要将数据信息载入 URL 联接,此特性的初始值为 false。此特性由setDoOutput()
方式 设定,其值由getDoOutput()
方式 回到。 -
boolean useCaches
:假如其数值 true,则只需有标准就容许协议书应用缓存文件;假如其数值 false,则该协议书自始至终务必得到此目标的新团本,其初始值为上一次启用setDefaultUseCaches()
方式 时给出的值。此特性由setUseCaches()
方式 设定,其值由getUseCaches()
方式 回到。 -
boolean connected
:表明URL是不是联接取得成功 -
URL url
:表明Connection类在网络上开启的url目标。
9 应用Socket程序编写之TCP Socket
Socket:tcp协议,用以端到端的通讯。
ServerSocket:用以服务器端目标的建立。网络服务器会复位一个端口的Socket,监视此端口号的联接。假如手机客户端创建联接,会分派一个含有新的端口的Socket,用于和手机客户端会话。当联接完毕时,会关掉Socket。
ServerSocket的accept()方式 :ServerSocket的accept()方式 从联接要求序列中取下一个顾客的联接要求,随后建立与顾客联接的Socket目标,并将它回到。假如序列中沒有联接要求,accept()方式 便会一直等候,直至接受到联接要求才回到。
网络服务器为要求联接的顾客过程创建一个先进先出法序列,默认设置尺寸一般是50,假如启用accept()方式 便会从序列中取下联接要求,服务器端为其创建一个socket。假如序列早已满,网络服务器会回绝新的联接要求。
9.1应用Socket建立CS联接
package two; import java.io.DataInputStream; import java.io.IOException; import java.net.ConnectException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class Test7 { } class TestServer{ public static void main(String[] args) { ServerSocket socket = null; try { //建立服务器端的socket socket = new ServerSocket(8888); //建立一个socket,接纳手机客户端的tcp协议 Socket s = socket.accept(); //表明 System.out.println("手机客户端的IP:" s.getInetAddress() ",手机客户端的端口:" s.getPort()); s.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } class TestClient{ public static void main(String[] args) { try { //服务器端和手机客户端在同一局域网络内。服务器端的端口是8888 Socket socket = new Socket("127.0.0.1",8888); //从socket中得到手机客户端的端口和IP DataInputStream dis = new DataInputStream(socket.getInputStream()); if(dis.available()!=0)System.out.println(dis.readUTF()); dis.close(); socket.close(); }catch (ConnectException e) { e.printStackTrace(); System.err.println("服务器连接不成功!"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
9.2应用socket开展上传图片
package org.lanqiao.service; import java.io.DataOutput; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class UploadService { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(10203); Socket socket = server.accept(); //获得对手机客户端载入的数据信息輸出字节流 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); File file = new File("timg.jpg"); //从当地照片得到键入流 FileInputStream fis = new FileInputStream(file); //载入輸出流 dos.write(fis.readAllBytes()); dos.close(); fis.close(); socket.close(); server.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } package org.lanqiao.client; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.Socket; public class UploadClient { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1", 10203); //获得服务器端发过来的键入流 DataInputStream dis = new DataInputStream(socket.getInputStream()); File file = new File("pic/mn.jpg"); FileOutputStream fos = new FileOutputStream(file); //将照片数据信息载入本地文件 fos.write(dis.readAllBytes()); System.out.println("提交进行"); fos.close(); dis.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
9.3 应用多线程优化CS在线聊天室
package two; import jdk.net.Sockets; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Test8 { public static void main(String[] args) { try { ServerSocket server = new ServerSocket(8888); while (true) { //只需服务器端打开,就一直接纳手机客户端的socket //ServerSocket的accept()方式 从联接要求序列中取下一个顾客的联接要求,随后建立与顾客联接的Socket目标,并将它回到。假如序列中沒有联接要求,accept()方式 便会一直等候,直至接受到联接要求才回到。 //socket中储存的是手机客户端的ip详细地址和向手机客户端开展通讯的端口 Socket socket = server.accept(); //并为这一socket运行新的服务器端进程 ServerThread st = new ServerThread(socket); st.start(); } } catch (IOException e) { e.printStackTrace(); } } } class ServerThread extends Thread { Socket socket; Scanner sc = new Scanner(System.in); public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { InputStream is = null; OutputStream os = null; try { //获得这一socket的I/O流 is = socket.getInputStream(); os = socket.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); String str = null; while (true) { //一直通讯,直至手机客户端断开抛出异常 if ((str = dis.readUTF()) != null) { if (str.equals("e")) break; System.out.println("手机客户端发过来的信息:" str); } System.out.println("输入您要向手机客户端推送的信息:"); String msg = sc.next(); dos.writeUTF(msg); System.out.println(); } dos.close(); dis.close(); socket.close(); //EOFException表示出现意外抵达流的末尾,如流终断 } catch (EOFException e) { System.out.println("手机客户端" socket.getInetAddress().getHostAddress() ":" socket.getPort() "撤出!"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } class ClientThread extends Thread { public static void main(String[] args) { Scanner sc = new Scanner(System.in); try { //创建联接,获得socket //socket中储存的是服务器端的ip详细地址和向服务器端开展通讯的端口 Socket socket = new Socket("127.0.0.1", 8888); InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); while (true) { //一直通讯,直至客户键入撤出联接 if (dis.available() != 0) System.out.println("网络服务器发过来信息:" dis.readUTF()); System.out.println("输入您要向服务器发送的信息(推送e完毕):"); String msg = sc.next(); if (msg.equals("e")) { System.out.println("已撤出闲聊"); break; } dos.writeUTF(msg); } dos.close(); dis.close(); os.close(); is.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
10应用Socket程序编写之UDP Socket
DatagramSocket类:接纳和传送数据报的tcp协议。应用UDP广播节目推送
DatagramPacket类:该类表明数据信息报包,它用于完成无联接包递送服务项目。依据该库中包括的详细地址和端口号等信息内容,将报文格式从一台设备路由器到另一台设备。
DatagramPacket的构造方法:
DatagramPacket(byte[] buf,int readLength):用以搭建接纳信息内容的数据信息报包
DatagramPacket(byte[] buf,int readLength,InetAddress inet):用以搭建发送短信的数据信息报包,inet目标中必须特定IP和端口
10.1应用UDP完成手机客户端向服务器端推送信息
处理汉语I/O错码:在推送端建立数据信息报包时,不必立即应用字符串数组或是字符串数组.getBytes()得到的字节数二维数组做为数据信息。建立ByteArrayOutputStream和以baos为輸出流的DataOutputStream,应用dos的writeUTF()方式 ,再得到baos应用的字节数二维数组。将这一二维数组做为主要参数。
在协调器建立接纳数据文件时,不必立即表明buf建立的字符串数组,先建立以buf为键入的ByteArrayInputStream和以bais为键入流的DataInputStream,最终应用dis的readUTF()读取这一字节数二维数组。那样便会鉴别汉语、韩语等语言表达。
package two; import java.io.*; import java.net.*; import java.util.Scanner; public class Test10 { } class UDPClient { public static void main(String[] args) { Scanner sc = new Scanner(System.in); try { DatagramSocket ds = new DatagramSocket(9999); System.out.println("手机客户端:"); while (true) { String line = sc.next(); if (line.equals("bye")) break; //建立baos和dos将读取数据信息輸出到字节数二维数组中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(line); byte[] buf = baos.toByteArray(); DatagramPacket packet = new DatagramPacket(buf,buf.length, new InetSocketAddress("127.0.0.1", 8888)); //datagramsocket.send(datagrampacket)方式 传送数据报 ds.send(packet); } ds.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } class UDPServer { public static void main(String[] args) { try { //协调器socket申请注册端口 DatagramSocket ds = new DatagramSocket(8888); System.out.println("服务端:"); while (true) { byte[] buf = new byte[1024]; //获得协调器数据信息报 DatagramPacket packet = new DatagramPacket(buf, buf.length); //datagramsocket.receive(datagrampacket)方式 接纳数据信息报 ds.receive(packet); //packet.getData()读取数据信息内容,回到的是字节数二维数组,必须依据二维数组的长短搭建字符串数组 //应用bais和dis载入得到的字节数二维数组。 ByteArrayInputStream bais = new ByteArrayInputStream(buf); DataInputStream dis = new DataInputStream(bais); System.out.println(dis.readUTF()); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }