• 网络协议基础


    HTTP: 

    HTTP 是属于应用层的面向对象的 ,  由于其简捷,快速的方式,适用于分布式超媒体系统 。  
    协议主要 特点 : 
    基于请求与响应模式的,无状态的,应用层的协议,常基于TCP的连接方式。
    1, 支持客户端服务器模式。
    2 , 简单快速,客户向服务器请求服务时,请求方法常用的有GET,POST。 每种方法规定了客户和服务器联系的类型不同。HTTP 协议简单,所以HTTP服务器的程序规模小,因而通信速度很快。
    3,灵活 :HTTP 允许传输任意类型的数据对象。正在传输的类型由Content-Type 加以标记
    4, 无连接: HTTP  状态协议是无状态协议,是指协议对于事物处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时,他的应答就比较快。
    5,明文传输
    协议 请求
    http请求由三部分组成,分别是:请求行、消息报头、请求正文
    请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF  
    请求方法 所有的
    GET     请求获取Request-URI所标识的资源
    POST    在Request-URI所标识的资源后附加新的数据
    HEAD    请求获取由Request-URI所标识的资源的响应消息报头
    PUT     请求服务器存储一个资源,并用Request-URI作为其标识
    DELETE  请求服务器删除Request-URI所标识的资源
    TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
    CONNECT 保留将来使用
    OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
     
     协议响应 
    在接收和解释请求消息后,服务器返回一个HTTP响应消息。
    HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
    HTTP-Version Status-Code Reason-Phrase CRLF
    其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
    状态代码有三位数字组成,第一个数字定义了响j应的类别,且有五种可能取值:
    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求
    常见状态代码、状态描述、说明:
    200 OK      //客户端请求成功
    400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
    403 Forbidden  //服务器收到请求,但是拒绝提供服务
    404 Not Found  //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error //服务器发生不可预期的错误
    503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
     
    HTTP  Cookie 和 Session
    Cookie: 
    如我们在网上购物的时候, 开始的时候先登录,然后选中商品加入到自己的购物车-其在客户单与服务器端的动作如下: 
    客户端—–(request:包含登录信息)——->服务器端 
    客户端<—(response:登录成功与否)——-服务器端 
    客户端—–(request:购物车里的信息)—–>服务器端 
    客户端<—(response:添加成功与否)—— -服务器端 
    这里关键是在第二次请求加入购物车的时候,因为客户端请求服务端是一种无状态的连接,那么服务器端怎么知道是谁,以及加入到谁的购物车。 
    解决的方式就是request到达服务器端的时候,服务器给在response中加一个“小饼干”,这个“小饼干”中就包含用户登录时候的一些基本的信息。当第二次客户端发起请求的时候,服务端检查到这个“小饼干”,据此识别出客户端,并进行相应的操作。而这个所谓的“小饼干”就是Cookie,持有这个小饼干的是客户端-即客户端保存中数据。
     
    Session: 
    Cookie方法的是把数据保存在客户端,而Session是把数据保存在服务器,而客户端具有一个唯一的ID. 
    小例子与上述一样,只是在两个类的处理方法的时候用到的是Session.
    二者比较:
    相同点:
    cookie与session都是用来跟踪浏览器用户身份的会话方式。
    不同点:
    总的来说,cookie是采取的客户端保状态的会话方式,而session采取的是服务器保持状态的会话方式。
    采用session的会话方式,用户量大时,因为数据保存在服务器,其服务器压力毫无疑问会比较大。还有其他的一些不同,如二者的存取方式等。
     
    浏览器与服务器的数据交互过程:
    Java 程序模拟
    1 ,模拟GET 请求
     1 public static void main(String[] args) {
     2 //目标URL
     3 String urlPath = "http://192.168.11.44/Agileone_1.2/index.php";
     4 //创建URL对象,对URL信息进行封装
     5 try {
     6 URL url = new URL(urlPath);
     7 //通过URL对象获取HttpUrlConnection对象
     8 HttpURLConnection httpURL = (HttpURLConnection)url.openConnection();
     9 //设置连接参数,可省
    10 //建立连接,tcp连接建立
    11 httpURL.connect();
    12 //获取输入流
    13 InputStream is = httpURL.getInputStream();
    14 BufferedInputStream bi = new BufferedInputStream(is);
    15 //用于存读取的字节长度
    16 int len=0;
    17 //定义存储响应结果的容器
    18 byte[] con = new byte[1024];
    19 //循环读入响应内容
    20 while((len = bi.read(con))!= -1){
    21 System.out.println(new String(con,0,len,"UTF-8"));
    22 }//
    23 释放资源
    24 bi.close();
    25 is.close();
    26 httpURL.disconnect();
    27 } catch (Exception e) {
    28 e.printStackTrace();
    29 }
    30 }
    2,POST 请求
     1 public static void main(String[] args) {
     2 //目标URL
     3 String urlPath="http://192.168.11.44/Agileone_1.2/index.php/common/login";
     4 //创建URL对象,对目标URL进行封装
     5 try {
     6 URL url = new URL(urlPath);
     7 //获取HttpURLConnection对象
     8 HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();
     9 //设置连接参数
    10 httpURL.setRequestMethod("POST");
    11 httpURL.setDoOutput(true);
    12 httpURL.setRequestProperty("Cookie", "PHPSESSID=cd6a4b2d273d71a465f2b62d022c7717");
    13 //建立TCP连接
    14 httpURL.connect();
    15 //获取输出流
    16 OutputStream os = httpURL.getOutputStream();
    17 //准备请求正文
    18 String par = "username=admin121&password=admin&savelogin=true";
    19 //将请求正文发送给服务器
    20 os.write(par.getBytes());
    21 //获取输入流,读取服务器响应内容
    22 InputStream is = httpURL.getInputStream();
    23 BufferedInputStream bi = new BufferedInputStream(is);
    24 int len=0;
    25 byte[] con = new byte[1024];
    26 //读取响应内容
    27 while((len=bi.read(con))!=-1){
    28 System.out.println(new String(con,0,len));
    29 }//
    30 释放资源
    31 bi.close();
    32 is.close();
    33 os.close();
    34 httpURL.disconnect();
    35 } catch (Exception e) {
    36 e.printStackTrace();
    37 }
    38 }

      

    TCP/IP:

    TCP/IP  协议特点
    1, 面向连接
       通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的,所以只能用于端口端的通讯。
    2, 基于字节流 
    3, 高可靠性
      TCP 采用发送应答机制,TCP发送的每个报文字段都必须要得到接受方的应答才认为这个TCP报文字段传输成功超时重传,发送端发出一个报文字段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
     
    TCP 协议的三次握手
    第一次握手: 主机A 发送位码为 syn =1 , 随机产生 seq number =200 的数据包,到服务器,主机B 由SYN =1知道,A 要求建立联机;
     第二次握手 : 主机B 收到请求后要求确认联机信息,向A发送   ack number =(主机A的sql+1),syn=1,ack=1,到随机产生seq number =500 的包;
    第三次握手 : 主机A收到后检查ack number 是否正确,即第一次发送的seq number+1 ,以及位码是否为1,若正确,主机A 会再发送ack number=(主机B 的seq+1),ack=1,主机B 收到后确认seq的值与ack=1则连接成功。
      完成三次握手,主机A 与主机B开始传送数据。
     
    协议概念-OSI参考模型
    第一次挥手: 客户端A发送一个FIN, 用来关闭客户A到服务器B的数据传送。
    第二次挥手: 服务器B收到这个FIN, 它发回一个ACK, 确认序号为收到的序号加1。
    和SYN一样, 一个FIN将占用一个序号。
    第三次挥手: 服务器B关闭与客户端A的连接, 发送一个FIN给客户端A。
    第四次挥手:客户端A发回ACK报文确认,并将确认序号设置为收到序号加1.
     
    TCP 与UDP 的比较
    UDP user datagram protocol, 同样会在物理线路上创建一条“ 虚拟信道,否则UDP协议无法传输数据! 但是, 当UDP协议传完数据后, 这条“ 虚拟信道”就被立即注销了! 因此, 称UDP是不面向连接的协议!
    集体区别为 :
     可靠与不可靠,快与慢,应用场景。
     
     WireShark 抓包使用
    协议过滤
    比如TCP,只显示TCP协议。
    IP 过滤
    比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102,
    ip.dst==192.168.1.102, 目标地址为192.168.1.102
    端口过滤
    tcp.port ==80, 端口为80的
    tcp.srcport == 80, 只显示TCP协议的愿端口为80的。
    Http模式过滤
    http.request.method=="GET", 只显示HTTP GET方法的。
    逻辑运算符为 AND/ OR
     

     TCP 协议 --Java 模拟客户端 

     1 public class ClientDemo {
     2     public static void main(String[] args) {
     3         //套接字:
     4         Socket soc = null;
     5         OutputStream os = null;
     6         InputStream is = null;
     7         BufferedReader br = null;
     8         try {
     9             soc = new Socket("localhost",544);
    10             //获取输出流
    11             os = soc.getOutputStream();
    12             //发送数据
    13             os.write("你好呀!".getBytes());
    14             //关闭输出流
    15             soc.shutdownOutput();
    16             //获取输入流
    17             is = soc.getInputStream();
    18             //将字节流转换为字符流
    19             br = new BufferedReader(new InputStreamReader(is));
    20             //操作客户端发送过来的数据
    21             String con =null;
    22             while((con = br.readLine()) != null){
    23                 System.out.print(con);
    24             }
    25         } catch (Exception e) {
    26             e.printStackTrace();
    27         } finally{
    28             try {
    29                 br.close();
    30                 is.close();
    31                 os.close();
    32                 soc.close();
    33             } catch (IOException e) {
    34                 e.printStackTrace();
    35             }
    36             
    37         }
    38         
    39     }
    40 }

    TCP 协议---Java 模拟服务器端

     1 public class ServerDemo {
     2     public static void main(String[] args) {
     3         //ServerSocket:服务器套接字
     4         ServerSocket server = null;
     5         Socket clientSo = null;
     6         InputStream is = null;
     7         BufferedReader br = null;
     8         OutputStream os = null;
     9         try {
    10             //绑定监听端口
    11             server = new ServerSocket(544);
    12             //阻塞接收客户端数据
    13             clientSo = server.accept();
    14             //可以操作数据包相关信息
    15             System.out.print(clientSo.getInetAddress().getHostAddress()+":");
    16             //获取输入流
    17             is = clientSo.getInputStream();
    18             //将字节流转换为字符流
    19             br = new BufferedReader(new InputStreamReader(is));
    20             //操作客户端发送过来的数据
    21             String con =null;
    22             while((con = br.readLine()) != null){
    23                 System.out.print(con);
    24             }            
    25             //获取客户端输出流
    26             os = clientSo.getOutputStream();
    27             os.write("你是逗逼么?".getBytes());
    28         } catch (IOException e) {
    29             e.printStackTrace();
    30         }finally{
    31             try {
    32                 os.close();
    33                 br.close();
    34                 is.close();
    35                 clientSo.close();
    36                 server.close();
    37                 
    38             } catch (IOException e) {
    39                 e.printStackTrace();
    40             }        
    41         }
    42     }
    43 }
     
     
     
  • 相关阅读:
    Tita 360 评估:新员工转正评估模版
    360反馈实例实例:如何给他人的弱点进行反馈
    数据库无法查询中文问题的解决过程
    sql server中判断表或临时表是否存在的方法
    5G网络
    Sqlserver中使用DBLINK
    Oracle 11g 安装图文教程
    SqlServer的Pivot和Unpivot用法
    ORACLE常用傻瓜問題1000問
    SqlServer的PIVOT、UNPIVOT将行转成列,列传成行
  • 原文地址:https://www.cnblogs.com/thelovelybugfly/p/10839239.html
Copyright © 2020-2023  润新知