OSI七层或五层模型(Http/WebSocket/Socket)

计算机网络基础知识总结- https://blog.csdn.net/tomatobor_yj/article/details/79957057
 计算机网络学习的核心内容就是网络协议的学习。TCP/IP协议毫无疑问是互联网的基础协议。
 在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位。

面试时,你被问到过 TCP/IP 协议吗?- https://blog.csdn.net/yulyu/article/details/69062288

TCP滑动窗口机制 流量控制?

数据传输阶段的主要特点:

 电路交换:整个报文的比特流连续的从源点直达终点,好像在一个管道中传送。
 报文交换:整个报文先传输到相邻的结点,全部存储下来后查找转发表,转发到下一个结点。
 分组交换:单个分组(报文的一部分)传送到相邻结点,传送到相邻结点,存储下来后查找转发表,转发到下一个结点。

网络层传输的包(packet,又称分组),在数据链路层中传输的是“帧”(frame)。
数据包传输过程- http://blog.sina.com.cn/s/blog_b43f755b0102vam5.html
  在发送端,数据链路层是接收来自网络层的数据分组,而在接收端它是接收来自物理层的比特流,所以数据链路层的成帧功能就包含两方面的含义:一是将来自网络层的数据分组封装成数据帧,二是将来自物理层的一个个比特流组装成数据帧。

数据帧封装和透明传输-https://book.2cto.com/201301/13719.html

> 数据交换与路由技术,路由数据转换传输,路由协议:
  路由协议主要运行于路由器上,路由协议是用来确定到达路径的,它包括RIP,IGRP(Cisco私有协议),EIGRP(Cisco私有协议),OSPF,IS-IS,BGP。起到一个地图导航,负责找路的作用。它工作在网络层。
  路由分为静态路由和动态路由,其相应的路由表称为静态路由表和动态路由表。
  路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。

使用分层次的路由选择方法,可将因特网的路由协议划分为:
内部网关协议IGPI(nterior Gateway Protocol):具体的协议有多种,如:RIP和OSPF等。
外部网关协议EGP(External Gateway Protocol):目前使用的协议就是BGP

在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等。
tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式。

 用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-20-8=65507字节,其中20字节为IP包头长度,8字节为UDP包头长度。用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,可能会被分段发送,如果比较短,可能会等待和下一次数据一起发送。
  最初的的交换机是工作在OSI/RM开放体系结构的数据链路层,也就是第二层,而路由器一开始就设计工作在OSI模型的网络层。由于交换机工作在 OSI的第二层(数据链路层),所以它的工作原理比较简单,而路由器工作在OSI的第三层(网络层),可以得到更多的协议信息,路由器可以做出更加智能的转发决策。

-- OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。
 1.应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
 2.表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等
 3.会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
 4.传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
 5.网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
 6.数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [2]  等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
 7.物理层
建立、维护、断开物理连接。(由底层网络定义协议)
 -- OSI的七层:
 第七层              应用层   (Application Layer)                         为应用程序提供网络服务
 第六层              表示层  (Presentation Layer)                         数据表示
 第五层              会话层  (Session Layer)                              互连主机通讯 
 第四层              传输层  (Transport Layer)                            端到端连接 
 第三层              网络层  (Network Layer)                              确定地址和最佳路径 
 第二层              数据链路层 (Data Link Layer)                         介质访问                  
 第一层              物理层   (Physical Layer)                            二进制的传输

-- TCP/IP五层模型的协议
应用层;传输层;网络层;数据链路层;物理层
OSI五层模型

-- TCP/IP 参考模型中有四层对应于ISO参考模型中的一层或多层。但ISO模型没有互联网层。下面概述每一层的目的如下: 
第五层   应用层 (Application Layer)
第四层   传输层   (Transport Layer)
第三层   互联网层 (Internet Layer)
第二层   网络接口层 (Network Interface Layer)

第一层   物理层   (Phsical Layer)

> OSI七层模型:


> OSI 5层模型:


------------------------------

> Http/WebSocket/Socket的区别

http 为短连接,单向通信 HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。HTTP是非状态性的。

1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

  WebSocket是HTML5出的东西 也就是说HTTP协议没有变化 但HTTP是不支持持久连接的。Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已。Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。
  Websocket的核心:Upgrade: websocket;Connection: Upgrade 。 long poll 和 ajax轮询。可以把 WebSocket 看成是 HTTP 协议为了支持长连接所打的一个大补丁,它和 HTTP 有一些共性,是为了解决 HTTP 本身无法解决的某些问题而做出的一个改良设计。
  WebSocket 的设计者们也早已想过。就是让服务器和客户端能够发送 Ping/Pong Frame(RFC 6455 - The WebSocket Protocol,https://tools.ietf.org/html/rfc6455#section-5.5.2)。这种 Frame 是一种特殊的数据包,它只包含一些元数据而不需要真正的 Data Payload,可以在不影响 Application 的情况下维持住中间网络的连接状态。(Ping/Pong Frame,Request/Response)
  WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:
 WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;
 WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。

  一个使用WebSocket应用于视频的业务思路如下:
使用心跳维护websocket链路,探测客户端端的网红/主播是否在线
设置负载均衡7层的proxy_read_timeout默认为60s
设置心跳为50s,即可长期保持Websocket不断开。

  WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。微信小程序中的WebSocket。WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。

  Socket是传输控制层协议,WebSocket是应用层协议。

  网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
  Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
  套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
   Socket长链接,双向(双工)通信,Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。Socket的Tcp/Udp连接。socket三种类型:Datagram socket(使用 UDP协议), stream socket(使用 TCP协议), Raw socket或Raw IP socket(路由器或其他网络设备使用)。
  Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。
  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

WebSocket与HTTP的关系:
相同点
1. 都是一样基于TCP的,都是可靠性传输协议。
2. 都是应用层协议。
不同点
1. WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。
2. WebSocket是需要握手进行建立连接的。

HTTP 协议:超文本传输协议,对应于应用层,用于如何封装数据.
TCP/UDP 协议:传输控制协议,对应于传输层,主要解决数据在网络中的传输。
IP 协议:对应于网络层,同样解决数据在网络中的传输。

> TCP/IP:

代表传输控制协议/网际协议,指的是一系列协议,TCP/IP 模型在 OSI 模型的基础上进行了简化,变成了四层,从下到上分别为:网络接口层、网络层、传输层、应用层。

 TCP详解(2):三次握手与四次挥手,一个TCP连接必须要经过三次“对话”才能建立起来。
 在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).SYN攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.

四次挥手过程如下: 
 1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。 
 2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。 
 3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。 
 4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。


>Socket服务端(Server):
package com.socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class SocketServer {
    public static String _pattern = "yyyy-MM-dd HH:mm:ss SSS";
    public static SimpleDateFormat format = new SimpleDateFormat(_pattern);
    // 设置超时间
    public static int _sec = 0;
 
    public static void main(String[] args) {
        System.out.println("----------Server----------");
        System.out.println(format.format(new Date()));
 
        ServerSocket server;
        try {
            server = new ServerSocket(8001);
            System.out.println("监听建立 等你上线\n");
 
            Socket socket = server.accept();
            System.out.println(format.format(new Date()));
            System.out.println("建立了链接\n");
 
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
            socket.setSoTimeout(_sec * 1000);
            System.out.println(format.format(new Date()) + "\n" + _sec + "秒的时间 快写\n"); 
            System.out.println(format.format(new Date()) + "\nClient:" + br.readLine() + "\n");
 
            Writer writer = new OutputStreamWriter(socket.getOutputStream());
             
            System.out.println(format.format(new Date()));
            System.out.println("我在写回复\n");
             
            writer.write("收到\n");
            Thread.sleep(10000);
            writer.flush();
             
            System.out.println(format.format(new Date()));
            System.out.println("写完啦 你收下\n\n\n\n\n");
        } catch (SocketTimeoutException e) {
            System.out.println(format.format(new Date()) + "\n" + _sec + "秒没给我数据 我下啦\n\n\n\n\n");
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Socket客户端 (Client):
package com.socket.v3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class SocketClient {
    public static String _pattern = "yyyy-MM-dd HH:mm:ss SSS";
    public static SimpleDateFormat format = new SimpleDateFormat(_pattern);
    // 设置超时间
    public static int _sec = 5;
 
    public static void main(String[] args) {
        System.out.println("----------Client----------");
 
        Socket socket = null;
        try {
            // 与服务端建立连接
            socket = new Socket("127.0.0.1", 8001);
            socket.setSoTimeout(_sec * 1000);
 
            System.out.println(format.format(new Date()));
            System.out.println("建立了链接\n");
 
            // 往服务写数据
            Writer writer = new OutputStreamWriter(socket.getOutputStream());
                         
            System.out.println(format.format(new Date()));
            System.out.println("我在写啦\n");
            Thread.sleep(10000);
            writer.write("有没有收到\n");
             
            System.out.println(format.format(new Date()));
            System.out.println("写完啦 你收下\n");
             
            writer.flush();
             
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(format.format(new Date()) + "\n" + _sec + "秒的时间 告诉我你收到了吗\n");
 
            System.out.println(format.format(new Date()) + "\nServer:" + br.readLine());
             
        } catch (SocketTimeoutException e) {
            System.out.println(format.format(new Date()) + "\n" + _sec + "秒没收到回复 我下啦\n\n\n\n\n");
            e.printStackTrace();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/ShareUs/article/details/79821055