1. 层次划分 |
为了使计算机厂家生产的计算机能够相互通信,国际标准化组织(IOS)提出了
开放系统互联参考模型
及著名的OSI/RM(Open System Interconnection/Reference Model)
常见的网络层次划分:TCP/IP四层模型
、TCP/IP五层模型
、OSI七层模型
TCP/IP四层模型
:网络接口层、网络层、传输层、应用层TCP/IP五层模型
:物理层
、数据链路层
、网络层、传输层、应用层OSI七层模型
:物理层、数据链路层、网络层、传输层、会话层
、表示层
、应用层2.OSI七层模型 |
TCP/IP协议时互联网的基础协议,任何和互联网有关的操作都狸奴开TCP/IP协议
物理层
(Physical Layer):物理层确保原始的数据可在各种物理媒体上传输,两个重要设备名称,中继器和集线器数据链路层
(Data Link Layer):最基本的服务是将源自网络层的数据可靠的传输到相邻节点的目标网络层,作用:物理地址寻址、数据的成帧、数据的检错、重发等 网络层
(Network Layer):实现两个端系统之间的数据透明传输,具体功能包括寻址、路径选择、连接的建立、保持和终止等。IP协议:仅仅提供不可靠、无连接的传送服务,主要功能有无连接数据报传输、数据报路由选择和差错控制 IP协议
(Internet Protecal):因特网互联协议ICMP协议
(Internet Control Message protocol):因特网控制报文协议ARP协议
(Address Resolution Protocol):地址解析协议RARP协议
(Reverse Address Resolution protocol):逆地址解析协议传输层
(Transport Layer):负责将上层数据分段并提供端到端、可靠的和不可靠的传输,还要处理端到端的差错控制和流量控制问题 会话层
:管理主机之间的会话进程,即负责建立、管理、中值进程间的会话,会话层还在数据中插入校验点来实现数据的同步表示层
:对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解,表示层的数据转换包括数据的加密、压缩、格式转换等应用层
:为操作系统或网络应用程序提供访问网络服务的接口
会话层、表示层和应用层重点:
3.IP地址 |
ABCD类地址
:
4.IP和子网掩码 |
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
5.ARP/RARP协议 |
ARP
协议只用在局域网中,将IP地址解析为MAC(硬件地址、物理地址) ,局域网的每一个主机都有ARP缓存,保存了最近发起的IP地址和MAC映射记录,当该主句要想局域网中某一主机发送数据时,会先从自己的缓存中查找,查看是否存在目标IP地址,如果找到MAC地址,从而发送过去,如果没有找到,就向局域网内广播包含自己的IP地址、MAC地址和目的主机的IP地址,只有目的主机会做出回应
RARP
则刚好相反,将MAC地址解析成对应的IP地址
6.路由选择协议 |
路由表
选择适当出口将分组送出去,而路由选择是根据路由选择算法
来更新路由表信息,可以简单的理解为路由选择更新路由表->路由器分组转发时使用IGP
、RIP
、OSPF
RIP协议
:是应用层的IGP路由选择协议,使用UDP进行路由信息更新,只和相邻的路由器,在固定时间间隔,交换各自整个路由表,基于UDP协议进行数据报发送
OSPF协议
(Open Shortest Path First):基于网络层的IGP路由选择协议,直接使用IP协议发送更新数据,向所有的其它路由器发送更新信息
BGP协议
:应用层的EGP路由选择协议,使用TCP协议更新路由信息
7.TCP/IP协议 |
TCP负责发现传输问题,一有问题就发出信号,要求重新传输,直到所有的数据安全正确地传输到目的地,而IP是给因特网的每一台联网设备的一个地址
TCP
协议时面向连接的,可靠的,基于字节流的传输层协议。通过三次握手
建立连接,需要四次握手
断开连接
三次握手 |
为什么要进行三次握手
:
在只有两次握手的情况下,假设客户端和服务端建立连接,中途连接请求数据包丢失了,这时客户端不得不再重新发一遍,这时服务端只接收到一个连接请求,因此可以正常建立连接,有时候客户端重新发送请求不是数据包丢失了,而是传输过程中网络并发量大在某点被阻塞了
,这种情形下服务端收到两次请求,并持续等待两个客户端向他发送数据,客户端实际上只发送一次请求,而服务端却有两个响应,造成资源浪费
四次挥手 |
当一方完成它的数据发送任务后就能发送一个FIN(英文的finish)来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
可靠传输 |
滑动窗口协议
和连续APQ
(自动重传请求),配和着流量控制
和拥塞控制
,使的整个过程保证:
滑动窗口协议
:用于网络数据传输时的流量控制,以免发生拥塞的情况,该协议允许发送方停止并等待确认前发送多个数据分组,由于发送方不必每发一个分组就停下来等待确认,该协议可以加速数据的传输,提高网络吞吐量
备注:当发送窗口和接收窗口的大小都等于1时,就是停止等待协议
自动重传请求
:包括停止等待ARQ协议、连续ARQ协议、错误侦测、正面确认和逾时重传
流量控制
:让发送方的发送频率不用太快,要让接收方来得及接收,利用滑动窗口机制
可以很方便实现流量控制,发送方的发送窗口不能超过接收方给出的接收窗口的数值
拥塞控制
:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路器不致过载,拥塞控制是一个全局性的过程,涉及所有的主机、路由器,以及与降低网络传输性能有关的所有因素,相反流量控制
往往指点对点通信量的控制,是端对端的问题
拥塞控制的方法
:
慢开始
:由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值,每经过一个传输轮次,拥塞窗口cwnd就加倍 拥塞避免
:让拥塞窗口缓慢地增加,即每经过一个往返时间就把发送方的拥塞窗口加1,而不是加倍 快重传
: 快恢复
:TCP和UDP的区别 |
例子
:TCP
就像打电话,需要先打通对方的电话,等待对方有回应才会跟对方继续说话,也就是确认可以发信息之后才会把信息发出去,TCP
上传任何东西都是可靠的;UDP
就好比发电报,发出去就完事了,对方有没有接收不用管,UDP
是不可靠的。TCP虽然可靠,但是传输较慢,UDP不可靠,但是传输较快
TCP
是面向连接的、可靠的、端到端基于字节流的传输协议,每次新建连接时要进行“三次握手”UDP
是面向非连接的、不可靠的传输协议TCP
要求系统资源较多,UDP
要求较少TCP
保证数据的正确性和顺序,UDP
可能会丢包,不保证顺序UDP
应用场景:面向数据报、拥有大量的client、对数据安全性无特殊要求、网络负担非常重,但是要求相应速度非常高8.UDP协议 |
UDP
用户数据报协议,是面向无连接的,由于通讯不需要连接,可以实现广播发送。通讯不需要接收方确认,不可靠的传输协议,可能出现丢包现象
UDP
主要用于那些面向查询—应答的服务,每个UDP
报文分UDP报头和数据区两部分,UDP
报头由4个域组成,其中每个域各占2个字节,具体如下:源端口号、目标端口号、数据报长度、校验值
9.DNS协议 |
DNS
是域名解析系统(DomainNameSystem),将URL解析为IP地址
10.NAT协议 |
NAT
网络地址转换(Network Address Translation)属接入广域网(WLAN)的技术,完美解决了IP地址不足的问题,而且还能够有效地避免来自网络的外部攻击,隐藏并保护网络内部的计算机
11.HTTP协议 |
HTTP
超文本传输协议(HyperText Transfer Protocol)是一种应用最广的网络协议
HTTP
包括的请求:
HTTP
响应:
status常见的状态码:
200
OK 服务器成功处理请求
304
Not Modified(未修改) 客户端的缓存资源是最新的,要客户端使用缓存内容
404
Not Found 未找到资源
501
Internal Server Error 服务器遇到错误,使其无法对请求提供服务
HTTP
中,GET和POST的区别
12.网络编程 |
一般的网络编程都称为Socket
编程,Socket
因为意思是“插座”
Socket
Socket
Socket
通常用来实现client-server连接Socket
和ServerSocket
分别用来实现双向连接的client和server连接两台电脑都安装在一个插座上,然后使用一根线的两端插到电脑插座上,这样就建立了连接
端口号是来区分一台机器上不同的应用程序的,一个应用程序可以占用多个端口号
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
原文链接:http://www.cnblogs.com/maybe2030/p/4781555.html#_label1