计算机网络
网络体系分层:
七层模型,也称为OSI(Open System Interconnection)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通讯系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。
ISO 就是 Internationalization Standard Organization(国际标准组织)。
TCP / IP 协议
在Internet中TCP/IP协议是使用最为广泛的通讯协议。TCP/IP是英文Transmission Control Protocol/Internet Protocol的缩写,意思是“传输控制协议/网际协议”
实际生活当中有时也确实就是指这两种协议(tcp和ip)。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。
-
TCP协议:面向连接的,可靠的流传输协议
-
UDP协议:是不具有可靠性的且不需要建立连接数据报协议,只负责发送,不管对方是否接受,保证的是传输的效率;例如我们的视频通话
这里所说的连接不是通常意义的连接,是有一个连接,回复,确定连接的过程
TCP建立连接通过三次握手:
> >TCP中断连接通过四次握手(一问一答,一问一答): >
这里以客户端请求断开连接为例子:
- 客户端向服务端请求断开链接
- 服务端确定并应答,
- 服务端请求断开连接,
- 客户端确认并应答
-
网络层ip协议: 其实就是ip地址:端口号; ip地址识别具体的那一个主机,端口号识别主机上的具体那一个应用程序; ip地址是动态分配的,即每次主机入网获取的ip地址可能不同,而我们的MAC地址是固定的,不能实现复用;这也是引入ip地址的目的,避免地址不必要的浪费。 IP 地址(IPv4 地址)由32位正整数来表示,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数,例如我们的主机地址是:127.0.0.1
ip地址又网络地址+主机地址组成
根据网络地址的位数我们把ip地址分为ABCD四类
ip类别 网络地址位数 主机地址位数 A 前8位 后24位 B 前16位 后16位 C 前24位 后8位 D 前32位 没有 D类ip主要用于广播,多播
端口号的确定
- 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。但并不是说可以随意使用任何一个端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 0~1023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 1024~49151 之间,不过这些端口号可用于任何通信用途。
- 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。
Socket 网络编程
在java中,我们用Socket类来实现对网络的操作,socket翻译过来为套接字的意思, 套接字是网络通信中最小的单位,可以理解为一个端点,两个这样的端点通过建立连接就可以通信了; Socket本质是编程接口(API),对TCP/IP的封装。
TCP协议编程
流式套接字,面向字节流
服务端:
Scanner input =new Scanner(System.in);
ServerSocket socket = new ServerSocket(6666);
//服务端等待连接,有一个连接就返回退出,没有就一直等待客户端的连接
Socket client = socket.accept();
System.out.println("已连接");
//拿到客户端的流,进行相关的读写操作
InputStream inputStream = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String s = br.readLine();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
if(s.equals("BYE")){
bw.write(s);
bw.newLine();
}else{
System.out.println(s);
bw.write(input.next());
bw.newLine();
}
bw.close();
br.close();
socket.close();
客户端:
Socket socket = new Socket("127.0.0.1",6666);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner input = new Scanner(System.in);
System.out.print("输入发给服务端的:");
bw.write(input.next());
bw.newLine();
bw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());
br.close();
bw.close();
socket.close();
UDP协议编程
数据报式套接字,面向无连接 ,谁先收,谁先启动
UDP编程不区分客户端和服务端
private static void udp() throws IOException {
// 监听端口,
DatagramSocket socket = new DatagramSocket(6666);
//发送 send()
String str = "hello !";
byte [] b = str.getBytes();
int length = b.length;
int port = 8888;
InetAddress inetAddress = InetAddress.getLocalHost();
DatagramPacket dp = new DatagramPacket(b,length,inetAddress,port);
socket.send(dp);
//接收 receive
byte [] bytes = new byte[1024];
DatagramPacket dpReceive = new DatagramPacket(bytes,bytes.length);
socket.receive(dpReceive);
System.out.println(new String(bytes,0,dpReceive.getLength()));
socket.close();
}
et(bytes,bytes.length);
socket.receive(dpReceive);
System.out.println(new String(bytes,0,dpReceive.getLength()));
socket.close();
}