OSI开发互联参考模型(只是一个参考并不是标准,没有提供实现)
- 物理层(网卡)
解决两台物理机之间最基本的通信需求,两台机器之间发送与接受比特流。定义了物理设备的标准如网线的类型,光纤的接口类型,介质的传输速率等。数模转换与模数转换,网卡工作在该层。
- 数据链路层(交换机)
数据链路层的作用主要有两个,第一:在硬件层面确定收发方的地址,MAC地址是在硬件层面给网络适配器分配的地址,是数据最终发送或接收时使用的地址。第二:介质访问控制,传送比特流的过程中,会发生误传,错传,因此介质访问控制提供帧同步,并可以在一定程度上进行错误检查。
- 网络层(ip协议)
随着网络结点的不断增加,两台主机间的通信往往需要通过多个结点。网络层的主要功能,将网络地址翻译成对应的物理地址,并决定最佳发送路径(可选路由,网路拥塞程度)路由器工作在该层,在网络层将数据封装成一个个的数据包同时网络层会为每一个数据包提供一个id号。该层的主要协议是IP协议。
- 传输层(tcp udp)
随着网络通信需求的不断增加,通信过程中需要传送大量文件,如海量文件传输,网络在通信的过程中会中断很多次,因此将大文件切割成一个个的段落。段落丢失或者乱序等问题,都由传输层来解决,该层的主要协议TCP 和UDP协议。
- 会话层
考虑用户层面的感受,每一次发送都不可能由用户去调用TCP打包,调用IP去寻址,因此需要引入一个自动收发包自动寻址的功能,因此引入了会话层,会话层的功能就是管理用户和应用程序之间的通信,管理下面的分层。
- 表示层(http)
发送方知道发送的数据大小,接收方不知道,所以规定必须要一个固定长度的消息头记入消息体的长度等信息。
在表示层数据将以网络能够理解的方案进行格式化,解决不同系统之间的通信问题。
TCP/IP
标志位
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。
tcp三次握手
为什么需要三次握手,为了初始化Sequence Number的初始值
隐患
解决隐患
四次挥手
为什么有timewait状态
确保被动关闭的一方能够收到ack包,若未收到,则重发,刚好是两个msl的时间。
避免新旧连接混淆,有些路由器会缓存数据包。
为什么要4次挥手
全双工,发送方和接收方都各自需要FiN报文和ACK报文
TCP的滑动窗口
窗口计算(可以通过窗口对发送端进行流量限制)
UDP
与TCP的区别
面向连接(三次握手、四次挥手) /无连接
可靠(握手、确认、重传)/不可靠
有序(序列号,到达可能是无序的,但是tcp会进行排序)/无序
速度慢(创建连接、保证有效、可靠)/速度快(主要用于在线视频、多人广播、多人在线游戏)
重量级(20字节头)/8字节头
使用TCP和UDP分别完成
客户端发送一个字符串到服务端,服务端接收到后打印出字符串的长度,并将长度返回到客户端。
- tcp
public class TCPClient {
public static void main(String[] args) throws IOException {
//创建socket指定连接的主机和端口
Socket socket = new Socket("127.0.0.1", 65000);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
//写入字符串
outputStream.write(new String("hello world").getBytes());
//获取服务器返回的信息
byte[] bytes = new byte[1034];
int ch = inputStream.read(bytes);
//将信息转为字符串
String s = new String(bytes, 0, ch);
System.out.println(s);
outputStream.close();
inputStream.close();
socket.close();
}
}
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建socket并绑定65000端口
ServerSocket serverSocket = new ServerSocket(65000);
while (true){
//监听该端口,知道客户端返回连接信息才返回
Socket socket = serverSocket.accept();
//执行业务逻辑
new LengthCalculator(socket).start();
}
}
}
public class LengthCalculator extends Thread{
private Socket socket;
public LengthCalculator(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//获得输入输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
//获取信息
byte[] bytes = new byte[1024];
//数组长度
int ch = inputStream.read(bytes);
//转为字符串
String s = new String(bytes, 0, ch);
//向输出流中写入字符串长度
outputStream.write(String.valueOf(s.length()).getBytes());
System.out.println(s);
//关闭资源
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- UDP
public class UDPClient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
byte[] bytes = "hello".getBytes();
//将ip地址封装成InetAddress对象
InetAddress[] addresses = InetAddress.getAllByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, addresses[0], 65001);
socket.send(packet);
byte[] data = new byte[100];
DatagramPacket receivedPacket = new DatagramPacket(data, 100);
socket.receive(receivedPacket);
System.out.println(new String(receivedPacket.getData(),0,receivedPacket.getLength()));
}
}
public class UDPServer {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(65001);
//用于存储收到的内容
DatagramPacket packet = new DatagramPacket(new byte[100], 100);
//将收到的内容转为packet
socket.receive(packet);
//获取真正的内容
byte[] data = packet.getData();
String s = new String(data, 0, packet.getLength());
System.out.println(s);
String len = String.valueOf(s.length());
byte[] lenBytes = len.getBytes();
//发送给客户端
//从packet中获取地址,端口.封装成packet对象
DatagramPacket toClient = new DatagramPacket(lenBytes, 0, lenBytes.length, packet.getAddress(), packet.getPort());
socket.send(toClient);
}
}
在这里插入代码片
HTTP协议
输入url后的访问流程
- DNS解析
- TCP连接(三次握手)
- 发送HTTP请求
- 服务器处理请求,并把带有HTML文本的结果通过HTTP报文返回
- 浏览器渲染页面
- 关闭连接(关闭连接和释放页面没有先后)四次挥手
常见HTTP状态码
三位数组成
- 第一位数:响应类别
get/post区别
cookie/session
cooke:
session
HTTP/HTTPS