本次主要从以下几个方面讲解网络基础
一、网络划分
二、OSI七层模型
三、IP和子网掩码
四、ARP/RARP协议
五、路由选择协议
六、TCP/IP协议
七、UDP协议
八、DNS协议
九、NAT协议
十、HTTP协议
十一、网络编程
一、网络划分
常见的网络层次划分:TCP/IP四层模型、TCP/IP五层模型、OSI七层模型
- TCP/IP四层模型:网络接口层、网络层、传输层、应用层
- TCP/IP五层模型:物理层、数据链路层、网络层、传输层、应用层
- OSI七层模型:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
二、OSI七层模型
- 物理层(Physical Layer):物理层确保原始的数据可在各种物理媒体上传输,两个重要设备名称,中继器和集线器
- 数据链路层(Data Link Layer):最基本的服务是将源自网络层的数据可靠的传输到相邻节点的目标网络层,作用:物理地址寻址、数据的成帧、数据的检错、重发等
- 有关数据链路层的知识点:
- 数据链路层为网络层提供可靠的数据传输
- 基本数据单位为帧
- 主要的协议:以太网协议
- 两个重要的设备名称:网桥和交换机
- 网络层(Network Layer):实现两个端系统之间的数据透明传输,具体功能包括寻址、路径选择、连接的建立、保持和终止等。
- IP协议:仅仅提供不可靠、无连接的传送服务,主要功能有无连接数据报传输、数据报路由选择和差错控制
- 重点知识:
- 网络层负责对子网间的数据包进行路由选择,可以是吸纳拥塞控制、网际互连等功能
- 基本数据单位为IP数据报
- 包含的主要协议:
- IP协议(Internet Protecal):因特网互联协议
- ICMP协议(Internet Control Message protocol):因特网控制报文协议
- ARP协议(Address Resolution Protocol):地址解析协议
- RARP协议(Reverse Address Resolution protocol):逆地址解析协议
- 重要的设备:路由器
- 传输层(Transport Layer):负责将上层数据分段并提供端到端、可靠的和不可靠的传输,还要处理端到端的差错控制和流量控制问题
- 有关的重点:
- 传输层将上层数据分段并提供端到端的、可靠的或不可靠的传输以及端到端的差错控制和 流量控制问题
- 包含的主要协议:TCP协议(Transmission Control Protocol,传输控制协议)、UDP(User Datagram Protocol, 用户数据报协议)
- 重要设备:网关
- 会话层:管理主机之间的会话进程,即负责建立、管理、中值进程间的会话,会话层还在数据中插入校验点来实现数据的同步
- 表示层:对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解,表示层的数据转换包括数据的加密、压缩、格式转换等
- 应用层:为操作系统或网络应用程序提供访问网络服务的接口
-
会话层、表示层和应用层重点:
-
数据传输基本单位为报文
-
包含的束腰协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议)、POP3(邮局协议)、HTTP协议
-
三、IP和子网掩码
IP地址
网络地址:IP地址由网络号和主机号组成,网络地址的主机号全为0,网络地址代表着整个网络
广播地址:也称为直接广播地址,是为了区分受限广播地址,广播地址与网络地址的主机号正好相反,广播地址中,主机号为全1,当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息
组播地址:
ABCD类地址:
A类地址以0开头,第一个字节作为网络号,地址范围:0.0.0.0~127.255.255.255
B类地址以10开头,前面两个字节作为网络号,地址范围:128.0.0.0~191.255.255.255
C类地址以110开头,前面三个字节作为网络号,地址范围:192.0.0.0~223.255.255.255
D类地址以1110开头,地址范围224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多通信)
E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255
只有ABC有网络号和主机号之分
IP由四段数字组成,3类常用的IP
A类IP段:0.0.0.0. 到127.255.255.255
B类IP段:127.0.0.0 到191.255.255.255
C类字段:192.0.0.0 到223.255.255.255
子网掩码:
A类的IP段:255.0.0.0 一个子网最多容纳1677万台主机
B类的IP段:255.255.0.0 一个子网最多容纳6万台主机
C类的IP段:255.255.255.0 一个子网最多容纳254台(最后一位不能使0和255, 2^8-2=254)主机
子网掩码决定了一个子网计算机的数目,计算公式是2的n次方,例如子网掩码255.255.255.0,转换二进制11111111.11111111.11111111.00000000 前面为1的表示网络数,后面为0的表示主机数,也就是后面0的数量决定了主机的个数,具体主机个数是2^8次方256个,但是有两个IP不能用那就是最后一段不能为0和255,所以是254台
也可以通过主机数来逆向推算出子网掩码
1.一个公司有530台电脑,设置子网掩码
先确定使用哪类IP较合适,显然是B类(A类太多,浪费,C类太少,不够)
2^9 < 530 < 2^10,所以子网掩码后面0的个数设为10个较为合适
则相应的子网掩码对应的二进制为11111111.11111111.11111100.00000000
转换成10进制为255.255.252.0
附:192.168.1.0/26 /26表示子网掩码前26位全为1,即对应的子网掩码为255.255.255.192,对应的二进制为11111111.11111111.11111111.11000000
判断是否在同一网段
网络标志:A类的只算第一段、B类的只算第一、二段、C类的只算第一、二、三段
将IP和子网掩码化为二进制文件,然后做与运算,得出的结果就是网络标识(重点看子网掩码的网络号)。
主机标识:将子网掩码取反,然后和IP做与运算
A IP:202.194.128.9
B IP:202.194.128.14
子网掩码:255.255.255.0
1.转换成二进制:
A:1100 1010.1100 0010.1000 0000.0000 1001
B:1100 1010.1100 0010.1000 0000.0000 1101
掩码:1111 1111.1111 1111. 1111 1111 .0000 0000
2.A、BIP与掩码做与运算
A:11001010.1100 0010.1000 0000 .0000 0000 转换成十进制 202.194.128.0
B: 1100 1010.1100 0010.1000 0000.0000 0000 转换成十进制 202.194.128.0
两个网络标识IP相同,说明在同一子网
3.计算主机标识:
将掩码取反:0000 0000.0000 0000.0000 0000.1111 1111
然后再再做与运算,得
A:0000 0000.0000 0000.0000 0000.0000 1001 转换成十进制为 9
B:0000 0000.0000 0000.0000 0000.0000 1101 转换成十进制为14
四、ARP/RARP协议
ARP协议只用在局域网中,将IP地址解析为MAC(硬件地址、物理地址) ,局域网的每一个主机都有ARP缓存,保存了最近发起的IP地址和MAC映射记录,当该主句要想局域网中某一主机发送数据时,会先从自己的缓存中查找,查看是否存在目标IP地址,如果找到MAC地址,从而发送过去,如果没有找到,就向局域网内广播包含自己的IP地址、MAC地址和目的主机的IP地址,只有目的主机会做出回应
RARP则刚好相反,将MAC地址解析成对应的IP地址
五、路由选择协议
分组转发和路由选择:分组转发是路由器根据路由表选择适当出口将分组送出去,而路由选择是根据路由选择算法来更新路由表信息,可以简单的理解为路由选择更新路由表->路由器分组转发时使用
常用的路由选择协议:IGP、RIP、OSPF
RIP协议:是应用层的IGP路由选择协议,使用UDP进行路由信息更新,只和相邻的路由器,在固定时间间隔,交换各自整个路由表,基于UDP协议进行数据报发送
OSPF协议(Open Shortest Path First):基于网络层的IGP路由选择协议,直接使用IP协议发送更新数据,向所有的其它路由器发送更新信息
BGP协议:应用层的EGP路由选择协议,使用TCP协议更新路由信息
六、TCP/IP协议
TCP负责发现传输问题,一有问题就发出信号,要求重新传输,直到所有的数据安全正确地传输到目的地,而IP是给因特网的每一台联网设备的一个地址
TCP协议时面向连接的,可靠的,基于字节流的传输层协议。通过三次握手建立连接,需要四次握手断开连接
6.1 三次握手
- 第一次握手:客户端发送syn(同步序列编号)包(syn=j)到服务器,并进入SYN_SENT(表示客户端已发送syn包)状态,等待服务器确认
- 第二次握手:服务器收到syn包,必须回ack(syn=j+1)确认包,去人收到的序号+1,同时自己发送一个syn(syn=k)包,即ack+syn包,此时服务器进入SYN_RECV状态
- 第三次握手:客户端收到服务端的SYN+ACK包,同时发送确认包ack(syn=k + 1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP建立连接)状态,完成三次握手
为什么要进行三次握手:
在只有两次握手的情况下,假设客户端和服务端建立连接,中途连接请求数据包丢失了,这时客户端不得不再重新发一遍,这时服务端只接收到一个连接请求,因此可以正常建立连接,有时候客户端重新发送请求不是数据包丢失了,而是传输过程中网络并发量大在某点被阻塞了,这种情形下服务端收到两次请求,并持续等待两个客户端向他发送数据,客户端实际上只发送一次请求,而服务端却有两个响应,造成资源浪费
6.2 四次挥手
当一方完成它的数据发送任务后就能发送一个FIN(英文的finish)来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
- 第一次挥手:TCP客户端向服务端发送一个FIN包,用来关闭客户端到服务端的数据传送,此时客户端仍能接收数据
- 第二次挥手:服务端接收FIN,发送一个ACK确认包,确认序号为收到的序号加1
- 第三次挥手:服务端关闭客户端连接,并发送一个FIN给客户端
- 第四次挥手:客户端发送ACK,确认将序号设置为收到的序号加1,完成4次挥手
6.3 可靠传输
滑动窗口协议和连续APQ(自动重传请求),配和着流量控制和拥塞控制,使的整个过程保证:
传输信道不产生差错
不管对方以多块的速度发送数据,接收方总是来得及处理收到的数据(通过累计确认、超时重传、拥塞控制三大块来保证)
- 滑动窗口协议:用于网络数据传输时的流量控制,以免发生拥塞的情况,该协议允许发送方停止并等待确认前发送多个数据分组,由于发送方不必每发一个分组就停下来等待确认,该协议可以加速数据的传输,提高网络吞吐量
备注:当发送窗口和接收窗口的大小都等于1时,就是停止等待协议
-
自动重传请求:包括停止等待ARQ协议、连续ARQ协议、错误侦测、正面确认和逾时重传
-
流量控制:让发送方的发送频率不用太快,要让接收方来得及接收,利用滑动窗口机制可以很方便实现流量控制,发送方的发送窗口不能超过接收方给出的接收窗口的数值
-
拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路器不致过载,拥塞控制是一个全局性的过程,涉及所有的主机、路由器,以及与降低网络传输性能有关的所有因素,相反流量控制往往指点对点通信量的控制,是端对端的问题
-
拥塞控制的方法:
- 慢开始:由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值,每经过一个传输轮次,拥塞窗口cwnd就加倍
拥塞避免:让拥塞窗口缓慢地增加,即每经过一个往返时间就把发送方的拥塞窗口加1,而不是加倍 - 快重传:
- 快恢复:
- 慢开始:由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值,每经过一个传输轮次,拥塞窗口cwnd就加倍
6.4 TCP和UDP的区别
例子:TCP就像打电话,需要先打通对方的电话,等待对方有回应才会跟对方继续说话,也就是确认可以发信息之后才会把信息发出去,TCP上传任何东西都是可靠的;UDP就好比发电报,发出去就完事了,对方有没有接收不用管,UDP是不可靠的。TCP虽然可靠,但是传输较慢,UDP不可靠,但是传输较快
- TCP是面向连接的、可靠的、端到端基于字节流的传输协议,每次新建连接时要进行“三次握手”
- UDP是面向非连接的、不可靠的传输协议
- TCP要求系统资源较多,UDP要求较少
- TCP保证数据的正确性和顺序,UDP可能会丢包,不保证顺序
- UDP应用场景:面向数据报、拥有大量的client、对数据安全性无特殊要求、网络负担非常重,但是要求相应速度非常高
七、UDP协议
UDP用户数据报协议,是面向无连接的,由于通讯不需要连接,可以实现广播发送。通讯不需要接收方确认,不可靠的传输协议,可能出现丢包现象
UDP主要用于那些面向查询—应答的服务,每个UDP报文分UDP报头和数据区两部分,UDP报头由4个域组成,其中每个域各占2个字节,具体如下:源端口号、目标端口号、数据报长度、校验值
八、DNS协议
DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务,可以简单地理解为将URL转换为IP地址。
域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,在Internet上域名与IP地址之间是一一对应的,DNS就是进行域名解析的服务器。DNS命名用于Internet等TCP/IP网络中,通过用户友好的名称查找计算机和服务。
九、NAT协议
NAT网络地址转换(Network Address Translation)属接入广域网(WLAN)的技术,完美解决了IP地址不足的问题,而且还能够有效地避免来自网络的外部攻击,隐藏并保护网络内部的计算机
十、HTTP协议
HTTP超文本传输协议(HyperText Transfer Protocol)是一种应用最广的网络协议
HTTP包括的请求:
- GET:请求读取URL所标志的信息
- POST:给服务器添加信息
- PUT:在给定的URL下存储一个文档
- DELETE:删除指定的URL所标志的资源
HTTP响应:
status常见的状态码:
- 200 OK 服务器成功处理请求
- 304 Not Modified(未修改) 客户端的缓存资源是最新的,要客户端使用缓存内容
- 404 Not Found 未找到资源
- 501 Internal Server Error 服务器遇到错误,使其无法对请求提供服务
HTTP中,GET和POST的区别
- GET是从服务器获取数据,POST是从服务器传送数据
- GET传送的数据量小,不能大于2KB,POST传输的数据量较大
- GET是安全方法,http请求不会发生什么动作,也就是不会对资源有修改的动作,不是指真正的安全,POST可能会修改服务器上的资源请求,便被称为“不安全方法”
- GET的请求数据会暴露在地址栏中,而POST请求则不会
- POST的安全性比GET高,比如登录操作,通过GET请求,用户名和密码都会暴露在URL上,此时的用户名和密码就很容易被他人拿到了
十一、网络编程
一般的网络编程都称为Socket编程,Socket因为意思是“插座”
Socket
两个Java应用程序可以通过一个双向的网络通信连续实现数据交换,这个双向链路的一端称为一个Socket
Socket通常用来实现client-server连接
java.net包中定义的两个类Socket和ServerSocket分别用来实现双向连接的client和server连接
建立连接时所需的寻址信息为远程计算机的IP地址和端口号Port
两台电脑都安装在一个插座上,然后使用一根线的两端插到电脑插座上,这样就建立了连接
端口号是来区分一台机器上不同的应用程序的,一个应用程序可以占用多个端口号
Socket通信模型
Socket范例
服务器端代码实现:
public class TestServerSocket {
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(60000);
/**
* 创建一个ServerSocket对象时往往会制定一个端口号,通过端口号来监听客户端连接
* 服务器会不间断接收客户端的连接请求
* */
while (true) {
Socket s = ss.accept();
/**
* 在服务端调用accept()方法接收客户端连接对象,该方法是个阻塞式方法,一直在等待着客户端连接
* 客户端是否能连上取决于服务器是否接受了客户端的连接请求
* */
System.out.println("A client Connected");
/**
* 使用InputStream输入流来接收从客户端发过来的信息,使用DataInputStream流处理接收到的信息
* */
DataInputStream dis = new DataInputStream(s.getInputStream());
/**
* 使用readUTF()方法将接收到的信息全部读取出来,存储到字符串中,readUTF()是阻塞式方法,会
* 一直等待客户端发送信息过来,阻塞式的方法效率一般不高的,客户端连上服务器端,就必须调用
* 服务器端的accept()方法,可accept()必须要等下一次循环才能被调用,如果上一个客户端一直不
* 发送信息,那么readUTD()方法就一直得不到信息,服务器端的程序就阻塞在这里,无法进入下一个
* 循环,这样其它客户端就无法连接了
* */
String str = dis.readUTF();
System.out.println(str);
dis.close(); // 关闭输入流
s.close(); // 关闭连接
}
}
}
public class TestClientSocket {
public static void main(String[] args) throws Exception{
Socket s = new Socket("192.168.42.4", 60000);
/**
* 客户端输入服务器端的IP和指定端口号申请连接服务器,成功连接之后就向服务器端发送消息
* 和接收客户端返回信息
* */
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
Thread.sleep(30000); // 客户端睡眠30秒后向服务端发送信息
dos.writeUTF("Hello, Server!!!");
os.close(); // 关闭输出流
s.close(); // 关闭客户端连接
}
}
打开服务器监听是否有客户端连接
运行结果:
A client Connected
Hello, Server!!!
Process finished with exit code -1