1 OSI参考模型
1.1 ISO 国际标准化组织(International Organization for Standization)
1.2 OSI 开放系统互连的体系结构 (Open System Interconnection)
1.3 OSI网络分层:物理层〉数据链路层〉网络层〉传输层〉会话层〉表示层〉应用层,下层为上层服务。
1.4 OSI各层协议:
物理层 : EIA/TLA RS...
数据链路层 : SDLC,STP...
网络层 : IP,IPX...
传输层 : TCP,UDP...
会话层 : ZIP...
表示层 : JPEG,MPEG...
应用层 : FTP,HTTP,SNMP...
2 TCP/IP参考模型
2.1 TCP/IPI网络分层(对应OSI网络分层):
主机-网络层(物理层,数据链路层)
网络互联层(网络层)
传输层(传输层)
应用层(会话层,表示层,应用层)
2.2 TCP/IP协议:对网络分层的各层次作了简化,除主机-网络层外提供完善的协议,核心协议是:TCP,IP协议。
2.3 各层主要功能
2.3.1 主机-网络层
TCP/IP协议没有提供实现及协议,要求第三方实现的主机-网络层为上层提供一个访问接口,来传递IP数据包。
美国电气及电子工程师学会实现的协议集有:以太网(IEEE802.3),令牌环网(IEEE802.4)
2.3.2 网络互联层
功能是发送IP数据包到目标主机(使用了IP协议,规定数据包的格式及数据包寻找路由的流程)
2.3.3 传输层
功能是源主机和目标主机的进程可以会话。它用了二种协议:TCP,UDP
TCP:面向连接,可靠的协议。UDP:不可靠,无连接的协议(SNMP,DNS)
2.3.4 应用层
2.3.4.1 TCP应用层的协议
FTP : 文件传输协议(网络上传输文件)
TELNET : 虚拟终端协议。
HTTP : 超文本传输协议
HTTPS : 安全超文本传输协议
POP3 : 邮局协议(访问远程服务器上的邮件)
IMAP4 : 消息访问协议(POP3的升级版)
SMTP : 简单邮件协议(发送电子邮件)
2.3.4.2 UDP协议
SNMP :简单网络管理协议
DNS : 域名系统协议
2.4 IP协议
IP网络中每台主机有唯一的IP地址,用于标识每个主机。IP地址的取值范围:0~255
IP地址由IP网址与IP主机地址组成。网络掩码确定IP地址中哪部分是网址,哪部分是主机地址。
IP网址 = 网络掩码 & IP地址(二进制)
NIC(统一负责全球的地址规划与管理)
CNNIC(中国地区IP分配与管理) http://www.cnnic.net.cn
192.168.0.0是网络地址,192.168.111.111广播地址
2.4.1 发送数据包的过程
IP网络上的主机通过ARP(地址解析协议),向相同IP网址的主机(包括真正的物主机地址:物理地址和IP地址)发送数据包。
ARP通过本地网络的路由的物理地址向目标IP地址发送数据包。具体按以下搜索并处理数据包:
数据包生命周期已到就抛弃---〉路由表的主机---〉 路由表,匹配子网的路由器--->路由表,匹配网络的路由器---〉默认路由。
2.4.2 域名
域名是从右到左表达意义,一般表示为:主机机器.单位名.网络名.顶层域名.
DNS(Domain Name System):提供域名与IP地址的转换,因它存放了域名与IP地址的映射信息。
2.4.3 URL(Uniform Resource Locator:统一资源定位器)
组成部分:应用层协议://主机IP地址或域名/资源所在路径/文件名
URL中常见的协议:ftp,file(访问本地计算机所在文件)
2.5 TCP协议及端口T
TCP协议确保进程间顺序通信及在IP协议在传送数据时的顺序重组包及数据完整。
端口范围为:0~65535,0~1023一般为固定服务。21为FTP,25为SMTP(邮件传输服务)80为HTTP(文本传输)135为RPC(远程过程调用)
客户进程请求服务器进行TCP连接时,操作系统为随机分配一个未占用端口,断开时端口被释放。
注意事项:TCP,UDP通过端口标识进程。TCP与UDP端口取值各自自由,允许这二个端口取值一样。
2.6 RFC(Request For Comment)
RFC:互联网相关技术规范性文档。
2.7 客户/服务器通信模式
有二个通信进程中,A为客户端进程,B为服务端进程, A向B发出请求,B响应请求。B可向多个客户端提供服务。
网络应用层规定了客户程序与服务程序通信的细节。如HTTP协议规定了请求与响应格式。
应用层通用服务端口
服务 端口 协议
文件传输服务 21 FTP
远程登录 23 TELNET
传输邮件服务 25 SMTP
超文本传输服服 80 HTTP
访问远程服务的邮件服务 110 POP3
互联网消息存取服务 143 IMAP4
安全的超文本传输服务 443 HTTPS
安全的远程登录 992 TELNETS
安全的互联网消息存取服务993 IMAPS
3 示例代码:
客户端示例代码(EchoClient)
import java.net.*;
import java.io.*;
public class EchoClient {
private String host = "localhost";
private int port = 8000;
private Socket socket;
public EchoClient() throws IOException {
socket = new Socket(host, port);
}
public static void main(String args[]) throws IOException {
new EchoClient().talk();
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void talk() throws IOException {
try {
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
BufferedReader localReader = new BufferedReader(
new InputStreamReader(System.in));
String msg = null;
while ((msg = localReader.readLine()) != null) {
pw.println(msg);
System.out.println(br.readLine());
if (msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器端口示例代码
import java.io.*;
import java.net.*;
public class EchoServer {
private int port = 8000;
private ServerSocket serverSocket;
public EchoServer() throws IOException {
serverSocket = new ServerSocket(port);
System.out.println("服务器启动");
}
public String echo(String msg) {
return "echo:" + msg;
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void service() {
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept(); // 等待客户连接
System.out.println("New connection accepted "
+ socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
pw.println(echo(msg));
if (msg.equals("bye")) // 如果客户发送的消息为“bye”,就结束通信
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close(); // 断开连接
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String args[]) throws IOException {
new EchoServer().service();
}
}
下面程序实现效果一样
import java.io.*;
public class EchoPlayer {
public String echo(String msg) {
return "echo:" + msg;
}
public void talk() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(echo(msg));
if (msg.equals("bye")) // 当用户输入“bye”,结束程序
break;
}
}
public static void main(String arg[]) throws IOException {
new EchoPlayer().talk();
}
}
/****************************************************
* 作者:孙卫琴 * 来源:<<Java网络编程精解>> * 技术支持网址:www.javathinker.org *
***************************************************/