网络协议与计算机网络体系结构

  • 知识点总结
  • 网络协议与分层体系结构
  • 开放系统互连参考模型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 强化笔记

知识点总结

  1. 网络中计算机的硬件和软件存在各种差异,为了保证相互通信及双方能够正确地接收信息,必须事先形成一种约定,即网络协议协议是指通信双方必须遵循的、控制信息交换的规则的集合,是一套语义和语法规则,用来规定有关功能部件在通信过程中的操作,它定义了数据发送和接收工作中必经的过程。协议规定了网络中使用的格式、定时方式、顺序和差错控制。一般说,一个网络协议主要由语法、语义和同步三个要素组成
  2. 计算机网络体系结构是计算机网络的各层及其服务和协议的集合,也就是它们所应完成的所有功能的定义,是用户进行网络互连和通信系统设计的基础。
  3. OSI七层模型从下到上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。类似于OSI-RM层次模型,TCP/IP的层次结构包含了四个层次,从下到上分别为网络接入层互连网络层传输层应用层。它们有一定的对应关系。
  4. 协议各层间存在信息交换,一个系统中的相邻两个层次间的信息交换是通过服务访问点这样的接口实现的。每一层和相邻层有接口,较低层通过接口向它的上一层提供服务,但这一服务的实现细节对上层是屏蔽的。较高层又是在较低层提供的低级服务的基础上实现更高级的服务。
  5. 目前在国际上最著名的两个国际标准化组织分别是ISOITU-TITU-T主要负责电话和数字通信领域的建议和标准。因特网的标准化工作由称为IAB的组织负责,下设Task Force负责具体的某一方面标准,如IETF负责因特网近期发展的工程与标准问题。有关文档成为RFC。如著名的 IP 协议和 TCP 协议的文档为RFC791RFC793

网络协议与分层体系结构

协议:是指通信双方必须遵循的、控制信息交换的规则的集合,是一套语义和语法规则,用来规定有关功能部件在通信过程中的操作,它定义了数据发送和接收工作中必经的过程。协议规定了网络中使用的格式、定时方式、顺序和检错。

协议的组成:语法、语义、同步

网络体系结构:计算机网络的分层、每层的功能以及每层使用到的协议的集合。

通信网络架构演进图_通信网络架构演进图


协议层次模型:下层为上层提供服务

通信网络架构演进图_socket_02

开放系统互连参考模型OSI/RM

为了更好地促进互联网络的研究和发展,国际标准化组织 ISO 在 1985 年制定了网络互连模型

  • OSI 参考模型(Open System Interconnect Reference Model),具有 7 层结构

五层的体系结构

  • 应用层:直接为用户的应用进程提供服务
    例如万维网服务需要HTTP协议,电子邮件需要SMTPMIME等协议,QQ聊天等应用进程。
  • 传输层:为两台主机中进程之间的通信提供服务
    注意是进程,因此socket编程中需要IP和端口号,因为每个进程的端口号不同。
  • 网络层:为网络上的不同主机之间提供分组的传输服务
  • 数据链路层:将源计算机网络层来的数据可靠的传输到相邻节点的目标计算机的网络层。
  • 物理层:透明的传送比特流

【例】主机甲向主机乙发送数据

通信网络架构演进图_大数据_03


通信网络架构演进图_socket_04


通信网络架构演进图_通信网络架构演进图_05


通信网络架构演进图_通信网络架构演进图_06


通信网络架构演进图_网络_07


通信网络架构演进图_大数据_08


通信网络架构演进图_socket_09


通信网络架构演进图_通信网络架构演进图_10

实体和服务访问点SAP

  • 实体:表示任何可以发送和接收信息的硬件或者软件进程。
  • 服务访问点(SAP):指相邻两层交换信息的地方。

通信网络架构演进图_网络_11

PDU:协议数据单元

通信网络架构演进图_通信网络架构演进图_12

TCP/IP体系结构

通信网络架构演进图_socket_13


主机A:

  • 应用层:直接为用户的应用进程提供服务。
  • 传输层:负责为两台主机中的各个应用程序之间提供通信服务。
  • 互连网络层: 负责独立地将分组从源主机送往目的主机,为分组提供最佳路由选择和交换功能。
  • 网络接入层: 它负责接收从网络层交付的IP分组,并将IP分组封装在帧中,通过底层的物理网络发送出去。

TCP/IP 协议栈

通信网络架构演进图_socket_14

沙漏计时器形状的TCP/IP协议族

通信网络架构演进图_java_15


通信网络架构演进图_大数据_16


通信网络架构演进图_java_17

两者的区别

出发点不同 :

  • OSI-RM是作为国际标准而制定的,不得不兼顾各方,考虑各种情况,造成OSI-RM相对比较复杂,协议的数量和复杂性都远高于TCP/IP
  • 早期TCP/IP协议是为军用网ARPANET设计的体系结构,一开始就考虑了一些特殊要求,如可用性,残存性,安全性,网络互联性以及处理瞬间大信息量的能力等。

对一些问题的处理方法不同 :

  • 对层次间的关系:OSI-RM模型严格按层次结构,而TCP/IP可以跨层;
  • 无连接服务问题 :OSI-RM模型只考虑面向连接的服务,而TCP/IP同时还考虑无连接服务。

网络通信标准化组织

  • ISO(1947年成立)
  • ITU(1865年成立)

因特网的标准化工作

通信网络架构演进图_大数据_18


RFC (Request For Comments),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多在标准内的论题,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中

通信网络架构演进图_通信网络架构演进图_19

【补充】TCP/IP 协议

TCP/IP 协议,简称 TCP/IP

  • 是一个网络通信模型,以及一整个网络传输协议家族,为网际网络的基础通信架构

TCP/IP 不仅仅指的是 TCPIP 两个协议

  • 是指一个由 FTPSMTPTCPUDPIP 等协议构成的协议家族
  • TCPIP 协议是该协议家族中最早通过的标准,所以称为 TCP/IP

TCP:Transmission Control Protocol,传输控制协议

IP:Internet Protocol,网际协议

通信网络架构演进图_java_20


通信网络架构演进图_java_21

TCP vs UDP

TCP 数据

通信网络架构演进图_java_22


在 Java 中,使用 java.net.Socketjava.net.ServerSocket 可以实现 TCP 请求

UDP 数据

通信网络架构演进图_socket_23


在 Java 中,使用 java.net.DatagramSocket 可以实现 UDP 请求

TCP - 三次握手 - 建立连接

通信网络架构演进图_大数据_24

TPC - 四次挥手 - 释放连接

通信网络架构演进图_大数据_25



OSI/RM和TCP/IP体系结构的比较

通信网络架构演进图_通信网络架构演进图_26

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();
		*/
	}
}

通信网络架构演进图_socket_27


通信网络架构演进图_大数据_28