计算机网络
1.构成要素
-
两台或两台以上的计算机相互连接起来才能构成网络,达到资源共享的目的
-
两台或两台以上的计算机连接,互相通信交换信息,需要有一条通道。
-
计算机之间要通信交换信息,彼此就需要有某些约定和规则,这就是协议
2.定义
把分布在不同地点且具有独立功能的 多个计算机,通过通信设备和线路连接起来,在功能完善的网络软件运行环境下,以实现网络中资源共享为目标的系统。
3. 计算机网络与分布式系统之间的区别
-
计算机网络是把分布在不同地点且具有独立功能的多个计算机,通过通信设备和线路连接起来,实现资源的共享。
-
分布式系统是在分布式计算机操作系统或应用系统的支持下进行分布式数据处理和各种计算机之间的并行工作,分布式系统在计算机网络的基础上为用户提供了透明的集成应用环境。
4. 组成
1. 以资源共享为主要目的的计算机网络从逻辑上可分成两大部分:
-
终端系统 -负责信息的处理
-
通信子网 -网络信息的传输和交换
2.从图论角度,网络由节点和链路构成。
节点:
边缘节点(构成终端系统)
包括主机、服务器等
中间节点(构成通信子网)
包括集线器、交换机
5. 计算机通信协议与网络体系结构
1. 通信协议与分层体系结构
1.1 分层
-
为什么要分层
计算机通信是一个复杂的过程,相互通信的两个计算机系统必须高度协调工作才行,而这种“协调”是相当复杂的。“分层”可以将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。
-
例子
-
首先发信人采用某种语言写成一封信,按照某种格式填好地址,投入到信箱中。
-
邮局收集信件,按照目的地址进行分类打包,并送到邮政处理中心。
-
处理中心汇集各个邮包,并进行再次分类,送到铁路等运输部门。
-
运输部门将邮包送到目的地的邮政处理中心。
-
目的地的邮政处理中心解包后根据目的地址,将信件送到相应的邮政分理处。分理处将信件送到收信人。收信人最终拆开信封,阅读信函。
-
1.2 协议
简单地说,协议是指通信双方必须遵循的、控制信息交换的规则的集合,是一套语义和语法规则,用来规定有关功能部件在通信过程中的操作,它定义了数据发送和接收工作中必经的过程。协议规定了网络中使用的格式、定时方式、顺序和检错。
6. 体系结构
1. OSI-RM体系结构
信息流动过程:
七层结构:
-
物理层:利用传输介质为通信的网络节点之间建立、维护和释放物理连接,实现比特流的透明传输,进而为数据链路层提供数据传输服务
-
数据链路层:在物理层提供服务的基础上,在通信的实体间建立数据链路连接,传输以帧(frame)为单位的数据包,并采取差错控制和流量控制的方法,使有差错的物理线路变成无差错的数据链路
-
网络层:为分组交换网络上的不同主机提供通信服务,为以分组为单位的数据报通过通信子网选择适当的路由,并实现拥塞控制、网络互连等功能。
-
传输层:向用户提供端到端(end-to-end)的数据传输服务,实现为上层屏蔽低层的数据传输问题
-
会话层:负责维护通信中两个节点之间的会话连接的建立、维护和断开,以及数据的交换
-
表示层:用于处理在两个通信系统中交换信息的表示方式,主要包括数据格式变换、数据的加密与解密、数据压缩与恢复等功
-
应用层:为应用程序通过网络服务,它包含了各种用户使用的协议。
原语:
计算机网络
1.构成要素
-
两台或两台以上的计算机相互连接起来才能构成网络,达到资源共享的目的
-
两台或两台以上的计算机连接,互相通信交换信息,需要有一条通道。
-
计算机之间要通信交换信息,彼此就需要有某些约定和规则,这就是协议
2.定义
把分布在不同地点且具有独立功能的 多个计算机,通过通信设备和线路连接起来,在功能完善的网络软件运行环境下,以实现网络中资源共享为目标的系统。
3. 计算机网络与分布式系统之间的区别
-
计算机网络是把分布在不同地点且具有独立功能的多个计算机,通过通信设备和线路连接起来,实现资源的共享。
-
分布式系统是在分布式计算机操作系统或应用系统的支持下进行分布式数据处理和各种计算机之间的并行工作,分布式系统在计算机网络的基础上为用户提供了透明的集成应用环境。
4. 组成
1. 以资源共享为主要目的的计算机网络从逻辑上可分成两大部分:
-
终端系统 -负责信息的处理
-
通信子网 -网络信息的传输和交换
2.从图论角度,网络由节点和链路构成。
节点:
边缘节点(构成终端系统)
包括主机、服务器等
中间节点(构成通信子网)
包括集线器、交换机
5. 计算机通信协议与网络体系结构
1. 通信协议与分层体系结构
1.1 分层
-
为什么要分层
计算机通信是一个复杂的过程,相互通信的两个计算机系统必须高度协调工作才行,而这种“协调”是相当复杂的。“分层”可以将庞大而复杂的问题,转化为若干较小的局部问题,而这些较小的局部问题就比较易于研究和处理。
-
例子
-
首先发信人采用某种语言写成一封信,按照某种格式填好地址,投入到信箱中。
-
邮局收集信件,按照目的地址进行分类打包,并送到邮政处理中心。
-
处理中心汇集各个邮包,并进行再次分类,送到铁路等运输部门。
-
运输部门将邮包送到目的地的邮政处理中心。
-
目的地的邮政处理中心解包后根据目的地址,将信件送到相应的邮政分理处。分理处将信件送到收信人。收信人最终拆开信封,阅读信函。
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKy80Snk-1585134609257)(C:\Users\艾健\Desktop\大厂面试\image-20200325172004706.png)]
-
1.2 协议
简单地说,协议是指通信双方必须遵循的、控制信息交换的规则的集合,是一套语义和语法规则,用来规定有关功能部件在通信过程中的操作,它定义了数据发送和接收工作中必经的过程。协议规定了网络中使用的格式、定时方式、顺序和检错。
6. 体系结构
1. OSI-RM体系结构
信息流动过程:
七层结构:
-
物理层:利用传输介质为通信的网络节点之间建立、维护和释放物理连接,实现比特流的透明传输,进而为数据链路层提供数据传输服务
-
数据链路层:在物理层提供服务的基础上,在通信的实体间建立数据链路连接,传输以帧(frame)为单位的数据包,并采取差错控制和流量控制的方法,使有差错的物理线路变成无差错的数据链路
-
网络层:为分组交换网络上的不同主机提供通信服务,为以分组为单位的数据报通过通信子网选择适当的路由,并实现拥塞控制、网络互连等功能。
-
传输层:向用户提供端到端(end-to-end)的数据传输服务,实现为上层屏蔽低层的数据传输问题
-
会话层:负责维护通信中两个节点之间的会话连接的建立、维护和断开,以及数据的交换
-
表示层:用于处理在两个通信系统中交换信息的表示方式,主要包括数据格式变换、数据的加密与解密、数据压缩与恢复等功
-
应用层:为应用程序通过网络服务,它包含了各种用户使用的协议。
原语:
- TCP/IP(对比)
7. TCP三次握手四次挥手
1.三次握手:
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND(发送)状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV(接收)状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(已建立)状态,完成三次握手。
2. 四次挥手:
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
简单总结
打电话 --连接-- 接了–通话 TCP
-
连接,稳定
-
三次握手 , 四次挥手
最少三次,保证稳定连接!
- A:你瞅啥?
- B:瞅你咋地?
- A:干一场?
- 挥手:
- A:我要断开了
- B:我知道你要断开了
- B:你真断开了吗?
- A:我真的断开了
-
客户端,服务器端
-
传输完成,释放连接,效率低
发短信 --发送了就完事了–接收 UDP
- 不连接,不稳定
- 客户端,服务器端:没有明确界限
- 不管有没有准备好,都可以发给你
- DDOS: 洪水攻击!端口堵塞
8. TCP和UDP的区别
UDP(User Data Protocol)用户数据报协议
- 无连接
- 不可靠(不能保证都送达)
- 面向报文(UDP数据传输单位是报文,不会对数据进行拆分和拼接操作,只是给上层传来的数据加个UDP头或者给下层来的数据去掉UDP头)
- 没有拥塞控制,始终以恒定速率发送数据
- 支持一对一、一对多、多对多、多对一
- 首部开销小,只有8字节
TCP(Transmission Control Protocol)传输控制协议
- 有连接
- 可靠的
- 面向字节流
- 全双工通信,TCP两端既可以作为发送端也可以作为接收端
- 连接的两端只能是两个端点,即一对一,不能一对多
- 至少20个字节,比UDP大的多
什么是TCP连接
TCP连接是一种抽象的概念,表示一条可以通信的链路。
每个TCP连接有且仅有两个端点,表示通信的双方,且双方在任意时刻都可以作为发送者和接受者。
什么是套接字
一条TCP连接的两端就是两个套接字。
套接字 = IP地址 :端口号
因此,TCP连接 = (套接字1,套接字2)= (IP1:端口号1,IP2:端口号2)
网络编程:
基于TCP的:
客户端:
package edu.xalead.TCP;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端
public class TcpClientSocket {
public static void main(String[] args) {
OutputStream os = null;
Socket socket = null;
try {
//1.知道服务器端口号
InetAddress serverIp = InetAddress.getByName("127.0.0.1");
int port = 9999;
socket = new Socket(serverIp,port);
//3.发送消息(输出消息) io流
os = socket.getOutputStream();
os.write("我发送了一条消息请接收!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
if (os!=null)
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
if (socket!=null)
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端:
package edu.xalead.TCP;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务器端
public class TcpServerSocket {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
//1.有一个ip地址
serverSocket = new ServerSocket(9999);
//2.等待客户端连接
socket = serverSocket.accept();
//3.读取客户端的消息
is = socket.getInputStream();
//管道流
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if (baos!=null)
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
if (is!=null)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
if (socket!=null)
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
if(serverSocket!=null)
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
基于udp的:
发送端:
package edu.xalead.UDP;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//不需要连接服务器(发送端)
public class UdpClient {
public static void main(String[] args) throws Exception {
//1. 建立一个Socket
DatagramSocket socket = new DatagramSocket();
//2. 建个包
String msg = "你好啊,服务器";
//发送给谁
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
//3. 发送包
socket.send(packet);
//关闭流
socket.close();
}
}
接收端:
package edu.xalead.UDP;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//还是要等待客户端的连接(接收端)
public class UdpServer {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//接收
socket.receive(packet);//阻塞接收
//输出包裹
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(),0,buffer.length));
//关闭连接
socket.close();
}
}
- TCP/IP(对比)
7. TCP三次握手四次挥手
1.三次握手:
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND(发送)状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV(接收)状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(已建立)状态,完成三次握手。
2. 四次挥手:
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
简单总结
打电话 --连接-- 接了–通话 TCP
-
连接,稳定
-
三次握手 , 四次挥手
最少三次,保证稳定连接!
- A:你瞅啥?
- B:瞅你咋地?
- A:干一场?
- 挥手:
- A:我要断开了
- B:我知道你要断开了
- B:你真断开了吗?
- A:我真的断开了
-
客户端,服务器端
-
传输完成,释放连接,效率低
发短信 --发送了就完事了–接收 UDP
- 不连接,不稳定
- 客户端,服务器端:没有明确界限
- 不管有没有准备好,都可以发给你
- DDOS: 洪水攻击!端口堵塞
8. TCP和UDP的区别
UDP(User Data Protocol)用户数据报协议
- 无连接
- 不可靠(不能保证都送达)
- 面向报文(UDP数据传输单位是报文,不会对数据进行拆分和拼接操作,只是给上层传来的数据加个UDP头或者给下层来的数据去掉UDP头)
- 没有拥塞控制,始终以恒定速率发送数据
- 支持一对一、一对多、多对多、多对一
- 首部开销小,只有8字节
TCP(Transmission Control Protocol)传输控制协议
- 有连接
- 可靠的
- 面向字节流
- 全双工通信,TCP两端既可以作为发送端也可以作为接收端
- 连接的两端只能是两个端点,即一对一,不能一对多
- 至少20个字节,比UDP大的多
什么是TCP连接
TCP连接是一种抽象的概念,表示一条可以通信的链路。
每个TCP连接有且仅有两个端点,表示通信的双方,且双方在任意时刻都可以作为发送者和接受者。
什么是套接字
一条TCP连接的两端就是两个套接字。
套接字 = IP地址 :端口号
因此,TCP连接 = (套接字1,套接字2)= (IP1:端口号1,IP2:端口号2)
网络编程:
基于TCP的:
客户端:
package edu.xalead.TCP;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端
public class TcpClientSocket {
public static void main(String[] args) {
OutputStream os = null;
Socket socket = null;
try {
//1.知道服务器端口号
InetAddress serverIp = InetAddress.getByName("127.0.0.1");
int port = 9999;
socket = new Socket(serverIp,port);
//3.发送消息(输出消息) io流
os = socket.getOutputStream();
os.write("我发送了一条消息请接收!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
if (os!=null)
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
if (socket!=null)
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务端:
package edu.xalead.TCP;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务器端
public class TcpServerSocket {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
//1.有一个ip地址
serverSocket = new ServerSocket(9999);
//2.等待客户端连接
socket = serverSocket.accept();
//3.读取客户端的消息
is = socket.getInputStream();
//管道流
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if (baos!=null)
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
if (is!=null)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
if (socket!=null)
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
if(serverSocket!=null)
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
基于udp的:
发送端:
package edu.xalead.UDP;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//不需要连接服务器(发送端)
public class UdpClient {
public static void main(String[] args) throws Exception {
//1. 建立一个Socket
DatagramSocket socket = new DatagramSocket();
//2. 建个包
String msg = "你好啊,服务器";
//发送给谁
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
//3. 发送包
socket.send(packet);
//关闭流
socket.close();
}
}
接收端:
package edu.xalead.UDP;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
//还是要等待客户端的连接(接收端)
public class UdpServer {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket socket = new DatagramSocket(9090);
//接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//接收
socket.receive(packet);//阻塞接收
//输出包裹
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(),0,buffer.length));
//关闭连接
socket.close();
}
}
欢迎访问我的个人博客:http://www.ayjup.cn