网络协议与计算机网络体系结构
- 知识点总结
- 网络协议与分层体系结构
- 开放系统互连参考模型OSI/RM
- 五层的体系结构
- 【例】主机甲向主机乙发送数据
- 实体和服务访问点SAP
- PDU:协议数据单元
- TCP/IP体系结构
- TCP/IP 协议栈
- 沙漏计时器形状的TCP/IP协议族
- 两者的区别
- 网络通信标准化组织
- 因特网的标准化工作
- 【补充】TCP/IP 协议
- TCP vs UDP
- TCP 数据
- UDP 数据
- TCP - 三次握手 - 建立连接
- TPC - 四次挥手 - 释放连接
- OSI/RM和TCP/IP体系结构的比较
- Java网络编程模拟人工智障聊天(狗头)
- 服务端代码
- 客户端代码
计算机专业基础笔记目录可以点这里:计算机专业基础笔记目录
Java笔记目录可以点这里:Java 强化笔记
知识点总结
- 网络中计算机的硬件和软件存在各种差异,为了保证相互通信及双方能够正确地接收信息,必须事先形成一种约定,即网络协议。协议是指通信双方必须遵循的、控制信息交换的规则的集合,是一套语义和语法规则,用来规定有关功能部件在通信过程中的操作,它定义了数据发送和接收工作中必经的过程。协议规定了网络中使用的格式、定时方式、顺序和差错控制。一般说,一个网络协议主要由语法、语义和同步三个要素组成。
- 计算机网络体系结构是计算机网络的各层及其服务和协议的集合,也就是它们所应完成的所有功能的定义,是用户进行网络互连和通信系统设计的基础。
- OSI七层模型从下到上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。类似于OSI-RM层次模型,TCP/IP的层次结构包含了四个层次,从下到上分别为网络接入层、互连网络层、传输层和应用层。它们有一定的对应关系。
- 协议各层间存在信息交换,一个系统中的相邻两个层次间的信息交换是通过服务访问点这样的接口实现的。每一层和相邻层有接口,较低层通过接口向它的上一层提供服务,但这一服务的实现细节对上层是屏蔽的。较高层又是在较低层提供的低级服务的基础上实现更高级的服务。
- 目前在国际上最著名的两个国际标准化组织分别是
ISO
和ITU-T
。ITU-T
主要负责电话和数字通信领域的建议和标准。因特网的标准化工作由称为IAB
的组织负责,下设Task Force
负责具体的某一方面标准,如IETF
负责因特网近期发展的工程与标准问题。有关文档成为RFC
。如著名的 IP 协议和 TCP 协议的文档为RFC791
和RFC793
。
网络协议与分层体系结构
协议:是指通信双方必须遵循的、控制信息交换的规则的集合,是一套语义和语法规则,用来规定有关功能部件在通信过程中的操作,它定义了数据发送和接收工作中必经的过程。协议规定了网络中使用的格式、定时方式、顺序和检错。
协议的组成:语法、语义、同步
网络体系结构:计算机网络的分层、每层的功能以及每层使用到的协议的集合。
协议层次模型:下层为上层提供服务
开放系统互连参考模型OSI/RM
为了更好地促进互联网络的研究和发展,国际标准化组织 ISO 在 1985 年制定了网络互连模型
- OSI 参考模型(Open System Interconnect Reference Model),具有 7 层结构
五层的体系结构
- 应用层:直接为用户的应用进程提供服务
例如万维网服务需要HTTP
协议,电子邮件需要SMTP
、MIME
等协议,QQ聊天等应用进程。 - 传输层:为两台主机中进程之间的通信提供服务
注意是进程,因此socket编程中需要IP和端口号,因为每个进程的端口号不同。 - 网络层:为网络上的不同主机之间提供分组的传输服务
- 数据链路层:将源计算机网络层来的数据可靠的传输到相邻节点的目标计算机的网络层。
- 物理层:透明的传送比特流。
【例】主机甲向主机乙发送数据
实体和服务访问点SAP
- 实体:表示任何可以发送和接收信息的硬件或者软件进程。
- 服务访问点(SAP):指相邻两层交换信息的地方。
PDU:协议数据单元
TCP/IP体系结构
主机A:
- 应用层:直接为用户的应用进程提供服务。
- 传输层:负责为两台主机中的各个应用程序之间提供通信服务。
- 互连网络层: 负责独立地将分组从源主机送往目的主机,为分组提供最佳路由选择和交换功能。
- 网络接入层: 它负责接收从网络层交付的IP分组,并将IP分组封装在帧中,通过底层的物理网络发送出去。
TCP/IP 协议栈
沙漏计时器形状的TCP/IP协议族
两者的区别
出发点不同 :
-
OSI-RM
是作为国际标准而制定的,不得不兼顾各方,考虑各种情况,造成OSI-RM
相对比较复杂,协议的数量和复杂性都远高于TCP/IP
。 - 早期
TCP/IP
协议是为军用网ARPANET
设计的体系结构,一开始就考虑了一些特殊要求,如可用性,残存性,安全性,网络互联性以及处理瞬间大信息量的能力等。
对一些问题的处理方法不同 :
- 对层次间的关系:
OSI-RM
模型严格按层次结构,而TCP/IP
可以跨层; - 无连接服务问题 :
OSI-RM
模型只考虑面向连接的服务,而TCP/IP
同时还考虑无连接服务。
网络通信标准化组织
- ISO(1947年成立)
- ITU(1865年成立)
因特网的标准化工作
RFC (Request For Comments),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多在标准内的论题,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。
【补充】TCP/IP 协议
TCP/IP
协议,简称 TCP/IP
- 是一个网络通信模型,以及一整个网络传输协议家族,为网际网络的基础通信架构
TCP/IP
不仅仅指的是 TCP
和 IP
两个协议
- 是指一个由
FTP
、SMTP
、TCP
、UDP
、IP
等协议构成的协议家族 -
TCP
、IP
协议是该协议家族中最早通过的标准,所以称为TCP/IP
TCP
:Transmission Control Protocol,传输控制协议
IP
:Internet Protocol,网际协议
TCP vs UDP
TCP 数据
在 Java 中,使用 java.net.Socket
、java.net.ServerSocket
可以实现 TCP 请求
UDP 数据
在 Java 中,使用 java.net.DatagramSocket
可以实现 UDP
请求
TCP - 三次握手 - 建立连接
TPC - 四次挥手 - 释放连接
OSI/RM和TCP/IP体系结构的比较
Java网络编程模拟人工智障聊天(狗头)
服务端代码
package com.mj;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws Exception {
try(ServerSocket server = new ServerSocket(8888)){
while(true){
Socket client = server.accept();
new Thread(() -> {
try {
doClient(client);
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}
static void doClient(Socket client) throws Exception{
try(
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = client.getInputStream();
OutputStream os = client.getOutputStream();
){
// 读取客户端数据
byte[] buffer = new byte[8192];
int len;
while((len = is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
byte[] bytes = baos.toByteArray();
String content = new String(bytes, "UTF-8");
String ip = client.getInetAddress().getHostAddress();
System.out.format("服务器接收到[%s]的数据:%s\n", ip, content);
// 写数据给客户端
os.write(doString(content).getBytes("UTF-8"));
}
}
static String doString(String str){
str = str.replace("你", "朕");
str = str.replace("吗", "");
str = str.replace("么", "朕");
str = str.replace("?", "!");
str = str.replace("?", "!");
return str;
}
public static void test() throws IOException{
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = socket.getInputStream();
byte[] buffer = new byte[8192];
int len;
while((len = is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
byte[] bytes = baos.toByteArray();
String string = new String(bytes, "UTF-8");
System.out.format("服务器接收到[%s]的数据:%s\n",
socket.getInetAddress(), string);
is.close();
baos.close();
socket.close();
serverSocket.close();
}
}
客户端代码
随便搭了个界面,搞笑用的。
package com.mj;
import java.awt.BorderLayout;
import java.awt.Font;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class MyFrame extends JFrame {
public MyFrame(){
setBounds(300, 300, 400, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
setContentPane(panel);
// 字体
Font font = new Font("微软雅黑", Font.PLAIN, 30);
JLabel label = new JLabel();
label.setFont(font);
panel.add(label, BorderLayout.CENTER);
JTextField tf = new JTextField(10);
tf.setFont(font);
panel.add(tf, BorderLayout.SOUTH);
JButton sendBtn = new JButton("发送");
sendBtn.setFont(font);
sendBtn.addActionListener((evt) -> {
try(
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
) {
// 写数据到服务器
os.write(tf.getText().getBytes("UTF-8"));
// 关闭输出(表明写给服务器的内容都写完了)
socket.shutdownOutput();
// 读取服务器数据
byte[] buffer = new byte[8192];
int len;
while((len = is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
byte[] bytes = baos.toByteArray();
String content = new String(bytes, "UTF-8");
label.setText("人工智障:" + content);
} catch (Exception e) {
e.printStackTrace();
}
});
panel.add(sendBtn, BorderLayout.EAST);
}
}
package com.mj;
import java.io.IOException;
public class TCPClient {
public static void main(String[] args) throws Exception, IOException {
MyFrame myFrame = new MyFrame();
myFrame.setTitle("对方是人工智障");
myFrame.setVisible(true);
/* Socket socket = new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
os.write("嘿嘿嘿".getBytes("UTF-8"));
os.close();
socket.close();
*/
}
}