目录
一.进程之间的通信
从IP来说,通信的两段是两台主机,IP数据报明确的标志了这两台主机的ip地址,但这两台主机之间的通信说法并不清楚
真正的进程通信是指在实体主机中的进程,是这台主机到另一台主机中的一个进程在交换数据(及通信),
也就是说,端口到端口之间的通信是进程之间的通信
二:复用和分用
假设我的主机现在有两个进程一个qq一个微信,你的主机也有qq和微信两个进程
那么此时可以使用同一个运输层协议传送数据,(当然要加上适当的首部)
也就是说复用就是:在发送方不同的应用进程之间可以使用同一个运输层协议传输数据
分用就是接收方的运输层在剥去报文的首部之后,能够把这些数据正确交给目的的应用进程
三:网络层和运输层的区别
网络层为主机之间提供逻辑通信
运输层为进程与进程之间提供端到端的逻辑通信
四:运输层的两个重要协议
①:用户数据包协议UDP
UDP在传输数据之前不需要建立连接,远地主机的运输层在收到UDP报文知乎,不需要给出任何确认,虽然
UDP不提供可靠的连接,但是在某些情况下UDP确实一种最有效的工作方式
例如:文件传送(TFTP),名字转换,IP电话
②:传输控制协议TCP
TCP提供面向连接的服务,在传输数据之前必须建立连接,数据的传送结束之后要释放连接,TCP不提供广播
或者多播服务,CP要提供可靠的,面向连接的运输服务,因此不可避免的增加了于多的开销,如
确认,流量控制,计时器,以及连接管理等,这不仅使协议的数据单元首部增大很多,还要占用许多的
处理机资源
例如:电子邮件,万维网,文件欢送(FTP)
③:流程控制协议SCTP:
是运输层增加的第三种协议,它具有TCP和UDP协议的共同有点,可支持一些新的应用,如IP电话
五:TCP/UDP协议<三次握手,四次挥手>
协议:约定,就好比我们现在说的是普通话
网络通信协议:速率,传输码率,代码结构,传输控制
TCP/IP协议
重要协议:
TCP:用户传输协议
UDP:用户数据报协议
TCP:
IP:网络互联协议
TCP与UDP对比
TCP:打电话
连接,稳定
三次握手,四次挥手(重点)
最少需要三次,保证稳定连接
简单举例:
A:你愁啥?
B:瞅你咋地?
A:干一场!
A:我要走了!
B:你要走了?
B:你真的要走了?
A:我真的要走了
标准:
<三次握手>
A: A向B发送请求建立连接
B: B收到请求建立连接之后,如果同意建立连接,则向A发送确认
A: A收到B的确认后,如果确认建立连接,还要给B给出确认
这样连接才建立完成
*
问题:为什么A还要再次发送一次确认请求呢?
这是为了防止A发送的已失效的连接请求突然又传到了B
比如A发出的第一个连接请求的报文段并没有丢失,而是在某个时间网络节点上时间滞留了,导致时间延迟,本来这是
一个早已失效的报文段,但B收到次失效的连接请求之后,误认为是A重新发出的一次连接请求,那么只要B发出
了确认,连接就此建立.
<4次挥手>
数据传输完成之后,通信双方都可以释放连接
A:A向B发出连接释放的报文段,停止在发送数据,主动关闭TCP连接
B:B收到A发出的连接释放报文段后即发出确认
这时TCP连接处于版关闭状态,也就是说B-->这个方向的连接并没有关闭,这个状态可能会维持一段时间
B:A收到B发出的确认后,就进入终止等待2状态,等待B发出的连接释放报文段
若B已经没有向A发送的数据包,B就释放连接,再次向A发送释放连接确认信号,等待A的确认
A:A收到B的再次确认之后,断开连接
客户端,服务端
传输完成,释放连接,效率低
已失效
UDP:发短信
不连接,不稳定
客户端,服务端没有明确的规定
不管有没有准备好,都可以发给你
TCP/UDP的实现
TCP
客户端
//客户端
public class TcpClientTest01 {
public static void main(String[] args) {
try {
//1,要知道服务器的地址
InetAddress serverIp
= InetAddress.getByName("127.0.0.1");
//2.端口号
int port = 9999;
//创建一个socket连接
Socket socket = new Socket(serverIp,port);
//发送io消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好".getBytes());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
public class TcpServletTest01 {
public static void main(String[] args) {
try {
//1.有一个地址
ServerSocket serverSocket = new ServerSocket(9999);
//等待客户端连接过来
Socket socket = serverSocket.accept();
//3.读取客户端的消息
InputStream inputStream = socket.getInputStream();
//管道流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while((len = inputStream.read(buffer)) != -1){
byteArrayOutputStream.write(buffer,0,len);
}
System.out.println(byteArrayOutputStream.toString());
byteArrayOutputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
}
}
}
UDP
客户端
public class UdpClientTest01 {
public static void main(String[] args) throws Exception {
//1.建立一个Socket
DatagramSocket datagramSocket = 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发送包
datagramSocket.send(packet);
}
}
服务端
//等待客户端连接
public class UdpServerTest01 {
public static void main(String[] args) throws Exception {
//开放端口
DatagramSocket datagramSocket = new DatagramSocket();
//接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);//接收
datagramSocket.receive(packet);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(),0,packet.getLength()));
datagramSocket.close();
}
}
六:TCP的特性和机制
安全性可靠性机制
①:确认应答
A向B发送数据,B收到A发送的数据包之后,会向A发送确认的报文
②:超时重发
背景:
假如A发送的数据包丢失,B没收到A发送的数据包,
实现:在一定时间内,如果没接
收到应答数据包,就要重新发
③:连接管理
三次握手,4次挥手
建立连接,数据传输,释放连接
④:流量控制
接收端处理数据的速度是有限的,如果发送端传输速率过快,导致接收端的缓存区没有缓存可以接收数据,
就会造成数据丢失,
所以TCP会根据接收端的处理能力,来决定发送端的发送速度
⑤:拥塞控制
发送端不清楚网络状态的时候,采取慢启动机制,先探路,再决定发送数据的速度,
TCP引入慢启动机制,先发少量的数据,探探路,摸清楚当前的网络拥堵状态,再按照多大速度传输数据
提高效率的机制
①:滑动窗口
并行的发送数据包,提高传输效率
②:延迟应答
接收端稍等一段时间再应答,这样程序可以有效的消费掉缓存区的数据,接收缓存区的缓存流量区就更大
返回的流量窗口大小就更大,发送端一次发送的数据就更多了
③:捎带应答
也就是接收端再接收到数据之后,要向发送端发送确认数据报,此时可以加上要向发送端发送的数据报
七:IP协议
网络层IP层的网络划分(重点)
IP地址:
格式:4个部分组成,8位二进制组成,每个部分为0~255(十进制),
组成:网络号+主机号
网络号:保证相互连接的主机之间具有不同的标识(用户网络信息通讯号码),也称为网段
在一个网络内,同一个网段的主机,据有相同的主机号
主机号:同一个网段内,主机之间可以具有相同的网络号,但是必须有不同的主机号
子网掩码
作用:子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
如何计算:
ip和子网掩码都是使用二进制数字,再基于位与操作,得到网络号
网络号再取反,得到主机号
特殊的ip:
广播ip:主机地址设置为1,以广播的方式,数据要发送到同一个链路的所有主机
本机ip: 127.*的ip地址用于本机环回测试,通常是127.0.0.1;
路由器:
路由器都具有接入公网的功能(有一个WAN网/公网的网卡,绑定公网的ip地址)
路由是什么?
在复杂的网络结构中,找出一条通往重点的线
类型:
主要是组建内网的方式不同
(1):后面的端口连接的主机,都是在一个网段(家庭用的路由器)
(2):后面的端口,每一个都有一个网卡(LAN网/局域网使用),绑定内网网段
发送端将数据包发送到接收端的流程
当ip数据包到达路由器的时候,路由器会先查看目的主机ip
路由器决定这个数据包是直接发送给目的主机,还是需要发送到下一个路由器,
一次反复,一直到达目标的ip地址
而路由器如何决定是直接发给目的主机还是下一个路由器是由路由器决定的,路由器具有路由控制/路由选择功能
如果目的ip命中了路由表,就直接转发即可
路由器内部维护一个路由表,(也就是公网网段的坐标),使用很多路由算法来计算路径;
数据链路层
以太网(数据格式体现为以太网帧头,帧尾):
MAC地址:
用于表示硬件的网络地址,(硬件传输数据的时候,必须知道对方的mac地址,才能发送)
对比ip地址和mac地址
ip地址是给用的逻辑地址,硬件无法使用,标识网络数据传输的起点和终点
mac地址:是给硬件用的物理地址,(网卡出场时的嗲之,全球唯一),标识网络数据传输的时经过的每一个节点.
ARP:
ARP协议是介于网络层和数据链路层之间的协议
作用:建立主机ip地址和mac地址的映射关系
本机/路由器保存有一个ARP缓存表,(通过ip能找到对应的mac),能找到网关的mac地址
MTU:
MTU相当于发快递包裹是对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层,产生的限制
MTU规定数据报发送时的大小,如果超出大小要进行分片;
MTU对IP层的影响
基于ip协议的字段来进行分片,接收时,基于对应的ip协议字段还原,
对UDP协议的影响
UDP时一次发,一次收,所以在分片以后,任何一个丢包,整个UDP的数据报就没用了,(丢弃)
对TCP协议的影响
TCP可以多次收发,并且有安全可靠的传输机制,如果分片后,某一个数据包丢失,接受以后,整个
TCP数据包就会丢弃,但是TCP具有超时重传机制,(影响相对较少)
==========================================================================================
DNS:
DNS是一整套从域名映射到IP的系统
域名:域名对应的就是主机,
域名是需要再网上申请的,申请的时候可以设置本域名绑定ip(可以有多个)
对应http的服务端口必须是80
DNS就是域名转为ip的协议
NAT技术:
NAT属于路由器使用的技术,对私网ip和公网ip互相转换的一种技术
NAPT
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的
IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系