)
目录前情回顾1、网络初识2、套接字网络原理之史上最伟大的发明-HTTP协议1、HTTP报文格式2、HTTP请求Request认识URL认识 ⽅法 (method)认识请求 报头 (header)HostContent-LengthContent-TypeUser-Agent (简称 UA)RefererCookie3、HTTP 响应详解 认识 状态码 (status code)200 表示响应成功404 not found 访问资源没有找到403 Forbidden405 Method Not Allowed500 Internal Server Error504 Gateway Timeout302 Move temporarily4、构造HTTP请求form 发送 GET 请求通过 ajax 构造 HTTP 请求通过 Java socket 构造 HTTP 请求5、HTTPS防劫持1、运营商劫持2、对称加密3、非对称加密4、中间人攻击5、引入校验机制前情回顾1、网络初识前面网络初识我们讲了协议协议分层和TCP/IP五层模型封装/分用我们来大概过一下协议网络协议的简称网络协议是网络通信 (即网络数据传输) 经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定计算机之间才能相互通信交流。协议分层只有相邻两层可以通信上层协议调用下层协议下层协议给上层协议提供服务不能跨层通信TCP/IP模型封装/分用在网络通信里面源主机通过TCP/IP模型进行封装上层协议加上头部信息交给下层最终到物理层变成二进制比特流传输到目标主机以后目标再按照TCP/IP模型进行解析并从物理层到应用层每层去掉头部解析成原来的可读信息发送端从上到下逐层加首部打包接收端从下到上逐层拆包分发2、套接字在传输层有两个核心协议TCP 有连接可靠传输面向字节流全双工UDP 无连接不可靠传输面向数据报全双工1、有连接的意思是TCP里面保存了对方的信息而UDP没有2、可靠传输和不可靠传输是网络传输容路由器堵车易丢包光信号/电信号外界干扰可靠传输就是能感知到丢包尽可能达到提高传输概率不可靠就只是把数据发了3、TCP读写数据以字节为单位UDP以数据报为单位4一个通信链路支持双向通信能读/能写我们一般使用Socket api进行网络编程他是操作系统提供的api这里我们来回顾一下在Java里面有两套api一个是UDP的DatagramSocket和DatagramPacket还有一个是TCP的Seversocket和Socket针对操作系统进行了封装注意事项1、读写数据通过Socket通过Socket内置的InputStream和OutputStream读写单位都是字节流网络原理之史上最伟大的发明-HTTP协议HTTP协议是超文本传输协议他是类似于一问一答形式请求和响应对应1、HTTP报文格式一个http请求分为请求头和请求体首行请求方式接着地址http版本请求头Header请求体Body首行版本号状态吗请求头和请求体2、HTTP请求Request认识URLUniform Resource Locator 统⼀资源定位符完整格式 协议:IP地址或资源路径:端口号例如认识 ⽅法 (method)虽然方法很多只用掌握两个Post和get就行了这两个请求非常常见由于主播这里非常熟悉这两个了我就大概做一下这两个区别1、两个可以语义上面混着用2、Get携带数据一般在URL上面Post携带的数据一般在请求体中3、网上说Post根安全一些这个说法错误通过抓包还是和get显示一样4、get传输有限制都是上古时期现在都没有了5、确实geturl里面只能放文本但是可以通过把二进制base64转成文本6、get也不是完全不能带Body只是有些客户端不支持认识请求 报头 (header)header 的整体的格式也是 键值对 结构Host表⽰服务器主机的地址和端⼝即你访问的目标资源的服务器地址与域名.Content-Length表⽰ body 中的数据⻓度用来表示请求体的数据长度如果请求体数据长度和这里不一样会产生错误Content-Type表⽰请求的 body 中的数据格式.有如下类型User-Agent (简称 UA)里面表示了用户设备的操作系统和浏览器的情况根据这些特性区分用户支持哪些特性Referer表⽰这个⻚⾯是从哪个⻚⾯跳转过来的. 形如直接输入url和点收藏是没有的Cookie通常浏览器里面的js代码无法直接访问文件系统出于安全考虑浏览器给js代码弄上了这个限制而cookie这种机制的出现是浏览器允许网页在本地存储的机制只能存储键值对cookie经常用于登录场景刚开始用户输入用户名和密码传到服务器那边服务器去查询数据库对比匹配成功生成session对象里面包含用户关键信息sessionid和session键值对存储到服务器的内存hash里面或者Redis里面然后在通过Set cookie返回sessionid给用户用户下次登录拿着这个发送到服务器就不用重新输入密码3、认识请求 正⽂ (body)正⽂中的内容格式和 header 中的 Content-Type 密切相关. 上⾯也罗列了三种常⻅的情况3、HTTP 响应详解 认识 状态码 (status code)状态码表⽰访问⼀个⻚⾯的结果. (是访问成功, 还是失败, 还是其他的⼀些情况...). 以下为常⻅的状态码.我们只需要掌握常见的就行了200 表示响应成功404 not found 访问资源没有找到403 Forbidden访问拒绝没有权限405 Method Not Allowed请求的方法和服务器注解不匹配会出现500 Internal Server Error服务器出现错误服务器抛出异常没有catch到504 Gateway Timeout当服务器负载⽐较⼤的时候, 服务器处理单条请求的时候消耗的时间就会很⻓, 就可能会导致出现超时的情况.302 Move temporarily临时重定向总结2xx开头是成功3xx是重定向4xx是客户端出错请求出现问题5xx是服务器出错服务器的代码有问题4、构造HTTP请求form 发送 GET 请求form actionhttp://abcdef.com/myPath methodGET input typetext nameuserId input typetext nameclassId input typesubmit value提交 /form通过 ajax 构造 HTTP 请求script srchttps://code.jquery.com/jquery-3.6.3.min.js/script 3 script 4 $.ajax({ 5 type: get, 6 url: https://www.sogou.com?studentNamezhangsan, 7 // 此处 success 就声明了⼀个回调函数, 就会在服务器响应返回到浏览器的时候触发该回调 8 // 正是此处的 回调 体现了 异步 9 success: function(data) { 10 // data 则是响应的正⽂部分. 11 console.log(当服务器返回的响应到达浏览器之后, 浏览器触发该回调, 通知到咱们 12 } 13 }); 14 console.log(浏览器⽴即往下执⾏后续代码); 15 /script通过 Java socket 构造 HTTP 请求本质上HTTP请求就是基于TCP只需要构造字符串符合HTTP协议格式写入到TCP Socket里面public class HttpClient { private Socket socket; private String ip; private int port; public HttpClient(String ip, int port) throws IOException { this.ip ip; this.port port; socket new Socket(ip, port); } public String get(String url) throws IOException { StringBuilder request new StringBuilder(); // 构造⾸⾏ request.append(GET url HTTP/1.1\n); // 构造 header request.append(Host: ip : port \n); // 构造 空⾏ request.append(\n); // 发送数据 OutputStream outputStream socket.getOutputStream(); outputStream.write(request.toString().getBytes()); // 读取响应数据 InputStream inputStream socket.getInputStream(); byte[] buffer new byte[1024 * 1024]; int n inputStream.read(buffer); return new String(buffer, 0, n, utf-8); } public String post(String url, String body) throws IOException { StringBuilder request new StringBuilder(); // 构造⾸⾏ request.append(POST url HTTP/1.1\n); // 构造 header request.append(Host: ip : port \n); request.append(Content-Length: body.getBytes().length \n); request.append(Content-Type: text/plain\n); // 构造 空⾏ request.append(\n); // 构造 body request.append(body); // 发送数据 OutputStream outputStream socket.getOutputStream(); outputStream.write(request.toString().getBytes()); // 读取响应数据 InputStream inputStream socket.getInputStream(); byte[] buffer new byte[1024 * 1024]; int n inputStream.read(buffer); return new String(buffer, 0, n, utf-8); } public static void main(String[] args) throws IOException { HttpClient httpClient new HttpClient(42.192.83.143, 8080); String getResp httpClient.get(/AjaxMockServer/info); System.out.println(getResp); String postResp httpClient.post(/AjaxMockServer/info, this is body System.out.println(postResp); } }使⽤ Java 构造的 HTTP 客⼾端不再有 跨域 限制了, 此时也可以⽤来获取其他服务器的数据了HttpClient httpClient new HttpClient(www.sogou.com, 80); String resp httpClient.get(/index.html); System.out.println(resp); // 此时可以获取到 搜狗主⻚ 的 html5、HTTPS防劫持1、运营商劫持首先我们来举一个例子运营商劫持问题我们点击下载天天动听正常情况下跳出天天动听的下载链接而出现运营商劫持的时候会弹出qq浏览器下载链接由于我们通过⽹络传输的任何的数据包都会经过运营商的⽹络设备(路由器, 交换机等), 那么运营商的⽹ 络设备就可以解析出你传输的数据内容, 并进⾏篡改. 点击 下载按钮, 其实就是在给服务器发送了⼀个 HTTP 请求, 获取到的 HTTP 响应其实就包含了该 APP 的下载链接. 运营商劫持之后, 就发现这个请求是要下载天天动听, 那么就⾃动的把交给⽤⼾的响应 给篡改成 QQ浏览器 的下载地址了.于是乎引入了HTTPS即HTTPSSL证书接下来详细介绍关于加密加密分为两大类一类是对称加密一类是非对称加密2、对称加密对称加密即加密和解密使用同一个密钥key适用于数据量大的加密但是如果黑客也控制了一个网络设备由于密钥是明文一旦黑客获取后续操作无意义了3、非对称加密引入非对称加密就是为了解决传输过程中的问题但是不适合数据量大的加密1、客⼾端在本地⽣成对称密钥, 通过公钥加密, 发送给服务器.2、由于中间的⽹络设备没有私钥, 即使截获了数据, 也⽆法还原出内部的原⽂, 也就⽆法获取到对称密钥3、服务器通过私钥解密, 还原出客⼾端发送的对称密钥. 并且使⽤这个对称密钥加密给客⼾端返回的响 应数据4、后续客⼾端和服务器的通信都只⽤对称加密即可. 由于该密钥只有客⼾端和服务器两个主机知道, 其 他主机/设备不知道密钥即使截获数据也没有意义.客⼾端如何获取到公钥? 客⼾端如何确定这个公钥不是⿊客伪造的?但是这样流程存在一个重大安全隐患通过特殊手段可以获取对称密钥——中间人攻击破坏安全传输性4、中间人攻击内容如下1、最开始服务器生成公钥和私钥pub1和pri2然后客户端开始向服务器询问公钥是什么黑客就会劫持然后转发给服务器2服务器返回公钥pub1黑客收到pub1然后自己生成公钥和私钥pub2和pri2然后把pub2发给客服端3、此时客户端无法分别pub2是不是服务器发过来的只能选择相信生成对称加密key用pub2加密发送4、黑客收到客户端发过来的请求使用pri2解密再修改内容使用pub1加密发送给服务器5、服务器收到使用pri2解密这就是中间人攻击过程5、引入校验机制中间人攻击的关键在于客户端无法区分收到的公钥是否是服务器真实的 公钥 还是被黑客篡改的公钥想办法能够对公钥是否正确进行校验1、服务器搭建的时候去找第三方认证机构将自己的公钥和域名信息交给第三方机构第三方认证机构将*证书机构是*证书有效期*服务器公钥*服务器拥有者域名这些信息使用算法类似hash进行校验得到校验和2、第三方机构生成pub2和pri2使用pri2加密校验和3、客户端开始向服务器询问证书服务器返回证书客户端将第三方认证机构将*证书机构是*证书有效期*服务器公钥*服务器拥有者域名这些信息使用相同的算法得到校验和1然后再使用公钥pub2对数字签名进行解密得到校验和2将校验和1 校验和2进行对比如果一致则证书没有修改如果不一致证书就是修改了总结HTTPS ⼯作过程中涉及到的密钥有三组.第⼀组(⾮对称加密): ⽤于校验证书是否被篡改. 服务器持有私钥(私钥在注册证书时获得), 客⼾端持有 公钥(操作系统包含了可信任的 CA 认证机构有哪些, 同时持有对应的公钥). 服务器使⽤这个私钥对证书的签名进⾏加密. 客⼾端通过这个公钥解密获取到证书的签名, 从⽽校验证书内容是否是篡改过.第⼆组(⾮对称加密): ⽤于协商⽣成对称加密的密钥. 服务器⽣成这组 私钥-公钥 对, 然后通过证书把公 钥传递给客⼾端. 然后客⼾端⽤这个公钥给⽣成的对称加密的密钥加密, 传输给服务器, 服务器通过私钥 解密获取到对称加密密钥.第三组(对称加密): 客⼾端和服务器后续传输的数据都通过这个对称密钥加密解密. 其实⼀切的关键都是围绕这个对称加密的密钥. 其他的机制都是辅助这个密钥⼯作的.第⼆组⾮对称加密的密钥是为了让客⼾端把这个对称密钥传给服务器. 第⼀组⾮对称加密的密钥是为了让客⼾端拿到第⼆组⾮对称加密的公钥小编在这里感谢大家的关注和点赞如有不足尽请指出未来我们一起加油