网络基础2

2023-05-16

网络基础2:应用层&传输层典型协议
应用层:自定制协议(私有协议),HTTP协议;:传输层:UDP &TCP协议
应用层:负责应用程序之间的数据沟通
应用层协议其实是面向程序员的协议,因为应用程序是程序员写的,因此应用程序之间如何沟通是程序员定的。
程序员自己定理的程序沟通的数据格式约定, 而针对某些场景,大佬们定制出的协议 大家觉得非常好,都用了这种协议,这种协议叫做知名协议 
自定制协议:程序员自己定义的程序沟通的数据格式约定
序列化:在网络传输或者数据的持久化存储时,将多个数据对象按照指定格式组织成为一个二进制数据传进行传输或持久化的过程。
反序列化:对二进制数据传,按照指定格式进行解析,得到各个数据对象的过程程序员设计自定制 协议的时候需要考虑的要素有哪些?
1.传输性能:定制一个协议,传输的数据尽可能短小,传输数据的时候才能尽可可能的快。
2.解析性能:传输多个数据对象的时候需要进行序列化,对方拿到数据后要进行行反序列化,解析性就是序列化和反序列化要足够快。
3.调试便捷性:讨论的更多是对程序员的可见性,可识别性。
HTTP协议:互联网公司中使用最多的协议。
认识:HTTP--超文本传输协议(最早期就是为用来传输web网页而设计的)
特性:
1.基于字符串明文传输的,调试便捷性高;
2.是一种简单的请求-响应协议(早期是短链接--一次请求-响应结束就关闭)
3.基于TCP协议,传输安全可靠。
格式:想要使用一个协议,用的好,就必须去了解他的格式,了解协议中每一个字段的功能。

一、请求行:

 请求行中的内容分为三部分,以空格作为间隔,请求行以\r\n作为结尾(请求行,其实刚好就是一行数据)

第一部分:请求方法:多种多样,描述不同的请求目的。
GET:向服务器请求一个网页实体资源,请求中没有正文,但是也可以向服务器提交娄数据,提交的数据在URL中(安全性低,长度受限)

POST:向服务器提交表单数据,请求中有正文
HEAD:GET和HEAD有什么区别--目的与GET类似,但是不同的是, 实际的响应中不要实体资源,只要响应头部 
PUT:更新服务器上的资源 DELETE:删除服务器上的资源

第二部分:URL

 第三部分:协议版本

描述了当前请求所使用的HTTP协议版本,不同的版本之间有功能支持力度上的差异。
  HTTP协议的版本迭代:
HTTP/0.9  0.9版本,是一个不成熟的版本,只能使用GET获取网页,而且也没有当前的完善的协议格式 
HTTP/1.0  1.0版本,完善了协议格式,新增支持了更多的请求方法:GET,HEAD,POST,并且有了缓存的控制,以及流媒体的传输 
HTTP/1.1  1.1版本,是当前用的最多的版本,新增支持了更多的请求方法:PUT,DELETE.... 
针对当前的网络,觉得以前的通信效率太低了:支持了长连接, 对缓存的管理更加精细了
长连接与短链接:
短链接:建立TCP连接-》发送请求-》接收响应-》关闭连接
每次要获取一个资源,都要重新建立连接,关闭连接,效率很低
长连接(管线化传输):
长连接:建立连接-》发送请求-》接收响应-》发送请求-》接收响应。。。。-》关闭连接
长连接管线化传输:建立连接-》发送请求-》接收响应-》发送请求1-》发送请求2-》接收响应1-》接收响应2-》关闭连接

 二、请求头部:

响应格式:响应行,响应头部,空行,正文

响应行: 协议版本 状态码 状态码描述 \r\n         HTTP/1.1 200 0K\r \n

状态码: 用于明确直接的向客户端表示本次请求的处理结果
1xx: 继续请求或者协议切换,101---协议切换
2xx: 请求已经成功处理了,200---成功处理;   206---区间内容处理成功
3xx:表示请求进行了重定向, 301--永久重定向;302--临时重定向;303--查看其他地址                              304--not modify
重定向: 一个请求,要请求的资源,被移动到了其他位置。 但要保持原链接依然有效。

 空行:间隔头部和正文                     正文:响应给客服端的数据

 混合加密:
思想:假设是客户端对服务器进行验证
1.服务器生成一对非对称密钥,连接建立成功,通信前,将公钥发送给客户端
2.客户端收到后,使用公钥加密一个随机数A,以及自己支持的对称加密算法
3.服务器收到后,使用私钥进行解密,得到了随机数A,以及对方的对称加密算法
4.服务器向客户端发送一个随机数B,以及自己支持的对称加密算法客户端和服务器,各自根据两个随机数以及支持的对称加密算法,计算出一个对称密钥,走到这一步,对称密钥就协商完毕了.   5.往后的通信使用对称密钥进行加密解密数据传输。

在实际的SSL加密中,身份验证和加密传输是整合在一起的。

CA证书中包含了更多的信息: 通信方的公钥,机构信息,证书颁发机构信息,失效时间.....整体流程:单向验证,以服务端验证为主
1.服务器自己生成一对密钥,拿着公钥,去第三方权威机构颁发证书
2.权威机构根据服务器的公钥,生成一个CA证书,给服务器
3.客户端与服务器建立连接后,通信前,服务器先将CA证书发送给客户端
4.客户端收到CA证书,进行解析验证权威机构是否自己信任,在权威机构验证对方身份,解析出公钥
5.客户端生成一个随机数,使用公钥对随机数+加密算法进行加密,发送给服务器                            6.服务器收到数据后,使用私钥进行解密,生成一个自己的随机数,将随机数和加密算法发送给客户端                                                                                                                                                   7.客户端收到数据后,客户端和服务器都有对方的随机数,和自己的随机数,以及加密算法,进行计算得到一个对称密钥                                                                                                                     8.往后通信,使用对称密钥进行传输加密

 

16位源端端口&16位对端端口: 描述通信两端进程

32位序号: 告诉接收端,这条数据在整体数据中的排序 ,接收端根据序号进行排序

32位确认序号: 向发送端进行回复确认,确认序号之前的数据都已经收到了

4位头部长度: 以4字节为单位描述tcp报文头部长度,tcp报头最长是60字节,最小20字节解析过程: 先取出20字节固定长度数据,然后根据头长取出选项数据,..

6位保留:暂时未使用
6位标志位: FIN,SYN,RST,PUSH,ACK,URG

16位窗口大小:用于实现滑动窗口机制,进行流量控制

16位校验和:二进制反码求和算法,校验数据一致性

16位紧急指针: 指向带外优先数据的结束位置

tcp协议特性: 面向连接,可靠传输,提供字节流传输服务面向连接: 通信前,要先建立连接,确保双方都是在线,具有数据收发能力的。

连接管理: 三次握手建立连接,四次挥手断开连接。
三次握手建立连接:通信前,要先建立连接,确保双方具有数据收发能力。

四次挥手断开连接: 通信结束了,会有一个断开连接过程,避免出现意外。

为什么握手是三次,挥手是四次?
1.建立连接,是双方都要确保对方具有数据收发的能力,因此都要进行SYN
2.两次不安全
1.有可能SYN会延迟到达,与重发的SYN形成冲突 (三次有状态要求
2.防止恶意攻击,比如客户端发送SYN后直接退出
3.四次没必要(没必要发送两次报文,在一次回复中将对应比特位置1即可)
三次握手失败了,两端是如何处理的客户端发送的?
第一次握手请求丢了,客户端会重传请求。
第二次握手失败服务端回复的ACK+SYN丢了,客户端会重传,服务端在等待对方的ACK回复超时后,给客户端发送一个RST报文,然后释放资源。   
第三次握手失败,服务器超时,回复rst,然后释放资源。

FIN 请求的功能:只能表示不再给对方发送数据(不代表不接收数据)。
CLOSE WAIT: 等待关闭,对方发送了FIN包,已经不再给自己发送数据上层如果这时候还在继续recv,则会读完缓冲区数据后,不再阻塞,而是返回0。 这种情况下就是等待上层针对这种情况的处理。

1.挥手为什么是四次
 1. FIN请求只能表示主动关闭方不再发送数据,不代表不再接收数据因此,被动关闭方收到FIN并进行确认后,还有可能会继续发送数据等待上层不再发送数据了,也要关闭套接字了才会发送FIN包因此挥手没有合并为三次
2.一台主机上出现了大量的CLOSE WAIT状态连接,是什么原因?                                                    1.只有收到了FIN请求并进行了确认回复的连接会进入CLOSE WAIT   。                                           2.一直处于CLOSE WAIT而没有进入下一步状态是因为,上层没有进行关闭套接字操作,也就是没有发送FIN,所以没有进入下一步 。                                                                                               3.因此原因就是代码中没有针对断开连接的套接字进行关闭处理。

3.TIME WAIT状态有什么用,为什么不直接关闭套接字释放资源?                                                1.TIME WAIT状态是主动关闭方在发送最后一次ACK后进入的状态                                                2.如果没有TIME WAIT,主动关闭方直接释放套接字资源,有可能出现新启动的套接字使用了与之前相同的地址信息
3.而上一次连接有可能最后一次ACK会丢失,一旦丢失被动关闭方会重传FIN                                4.就会导致上一次通信因为最后一次ACK丢失,而遗留的问题 (重传FIN)对新连接造成影响。
因此不能直接释放资源,需要等待两个MSL时间,针对有可能存在的FIN重传进行处理,并保证上一次通信的所有数据都消失在网络中。

MSL:报文最大生命周期(一个报文在网络中最大能存在的时间),默认60s.

4.一台主机上出现了大量的time_wait状态连接,是什么原因,如何处理?
1.time wait是主动关闭方发送最后一次ACK后进入的状态,等待一段时间是为了处理有可能因为FIN丢失导致的FIN重传的处理因此一台主机出现大量time wait连接,是因为主机上大量的主动关闭了连接常见于爬虫服务器
2.time_wait等待时间是可配置的,可以将时间设置的更短
3.有个套接字选项,叫做地址重用。 setsockopt();
tcp连接管理中的保活机制:
连接断开有个信息: recv会返回0,send会触发异常 SIGPIPE
tcp通信中,如果客户端和服务端通信频率并不高,中间突然网断了,没有四次挥手的机会,如果两端通信频率很低,可能需要很久才会发现
在通信中,客户端与服务器若长时间无通信 (默认7200s) ,则tcp服务器会自动的向客户端发送保活探测心跳包,要求对方进行响应 (默认每隔75s)若连续多次都没有收到响应(默认9次) ,则认为连接断开
这都是配置,可配置的。 甚至可以用套接字选项设置

2、可靠传输:
1.保证可靠: 面向连接,确认应答机制,超时重传机制,序号,确认序号,校验和

2.避免丢包: 滑动窗口机制,拥塞机制
3.性能挽回: 快速重传协议,延迟发送机制,延迟应答机制,捎带应答机制

没有必要的性能损失处理机制:
1.滑动窗口机制: 通过协议字段中的窗口大小字段实现的接收方每次接收到数据都会进行确认回复,在确认回复的时候就会计算自己的接收缓冲区中的剩余空间大小,将这个数字放入窗口大小字段中给对方回复。

发送方根据确认回复中的窗口大小字段,确定自己最多发送多少数据
这就是tcp中的流量控制--避免因为发送方发送数据过多导致接收方接收缓冲区溢出而导致的丢包

性能的挽回:
tcp为了保证可靠传输,牺牲了部分传输性能,但是有些性能的损失是没有必要的

1.因为发送数据过多,导致对方缓冲区溢出而丢包

2.因为网络状况的突变,导致大量的丢包重传
3.因为确认应答丢失所导致的重传

流量控制: 

 

停等协议: 发送方发送一条数据后,收到回复才会发送下一条数据
适用于网络状况较差的场景

回退n步协议: 滑动窗口机制决定了tcp数据传输可以管线化传输,可以连续发送多个报文,而在传输过程中,如果出现了丢包,回退n步协议,指的是从丢包的这个数据开始重新对数据进行传输。适用于网络状态一般的场景
选择重传协议: 传输过程中,丢包了,哪个包丢了,就对哪个包重传适

用于网络较好的场景

拥塞控制:
虽然 TCP 有了滑动窗口这个大杀器 , 能够高效可靠的发送大量的数据 . 但是如果在刚开始阶段就发送大量的数据 , 仍 然可能引发问题.
因为网络上有很多的计算机 , 可能当前的网络状态就已经比较拥堵 . 在不清楚当前网络状态下 , 贸然发送大量的数据 , 是很有可能引起雪上加霜的.
TCP 引入 慢启动 机制 , 先发少量的数据 , 探探路 , 摸清当前的网络拥堵状态 , 再决定按照多大的速度传输数据

 而发送方,连续收到三条第一条数据的确认回复,则会对第一条数据进行重传
收到三条重传请求,才对数据进行重传,这是因为要考虑第一条数据可能只是网络延迟了,而并没有丢包的情况,因此以3次作为判断基准,给一定的缓冲时间。

性能的挽回:
快速重传协议: 避免每次重传都需要等待超时才进行

延迟发送机制:
       解决频繁的小数据发送效率较低的情况,每次发送数据,数据并不会立即被发送而是会等待一小会,在这期间有可能又会有小数据被放到发送缓冲区,小数据就会积累成为大数据,经过一次IO就可以完成传输。减少了1O次数提高了效率。

延迟应答机制:
       基于确认应答机制,接收方需要对发送方的每一条数据进行确认回复。而如果直接对数据进行确认回复,大概率数据在缓冲区并没有被取出,因此这时候的回复会导致窗口大小变小,网络的吞吐率降低了 (传输效率降低了) ,因此设计者就设计延迟一会应答,这段延迟的时间中,应用程序就有可能将数据取出,保持窗口不变吞吐率不变,尽可能的总是以最大速率传输数据。

捎带应答机制:
       基于确认应答机制,接收方需要对发送方的每一条数据进行确认回复但是每一个回复都是一个最小20字节的报文,也会占据带宽因此设计者认为,如果收到了一条数据后,接收方刚好也有数据要发送给对方,就干脆将这个确认回复与要发送的数据结合到一起 (确认应答也就是个确认序号)发送给对方。这样可以尽可能减少空报文的传输。

3、字节流传输

粘包问题: 数据在缓冲区中堆积,将多条数据当作一条数据进行处理的过程                                   粘包产生的本质原因:数据之间缺乏边界管理                                                                                 tcp粘包原因: tcp在传输层,并不管传输什么数据,只管从缓冲区取合适大小的数据进行操作,没有边界管理。
解决方案: 在应用层,程序员对数据进行边界管理
边界管理: 明确一条数据从哪开始,到哪结束

1.特殊字符间隔:需要对数据中的特殊字符进行编码,避免歧义                                                       2.数据定长:数据固定长度,缺陷就是需要以最大长度定线(浪费较多)                                             3.数据采用TLV格式:在应用层头部中定义数据的长度(先取头部,根据头部中的长度,决定取多少数据) 。--典型做法:HTTP,UDP

UDP粘包怎么解决?
UDP根本就没有粘包问题,因为UDP的面向数据报传输方式,本身就是次最多交付一条数据 (UDP本身就有数据的边界管理)。udp的sendto接口发送数据,将数据放到发送缓冲区之后,会立即封装头部进行发送。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络基础2 的相关文章

  • 上层应用开发是否真的没有底层开发有前途?

    首先明确什么是底层开发 xff0c 这个界限很难划分 xff0c 有人说搞音视频底层编解码就是底层了 xff0c 但是我们看来不是这样 xff0c 下面还有rom中音视频模块 xff0c 再下面还有driver xff0c 最后到物理硬件
  • python http的请求和响应

    span class token triple quoted string string 34 34 34 http请求 请求行和空行是必须要有的 xff0c 请求体和请求头可以没有 请求格式 xff1a 请求行 xff0c 请求头 xff
  • ROS学习篇第(六)篇:通信

    目录 串口通信 ros serial 包的使用ROS分布式多机通信 ssh的使用 xff11 目的2 关于SSR3 实现4 问题 串口通信 ros serial 包的使用 下载 span class token function sudo
  • 小觅双目立体避障模组新品发布,发力AGV物流领域

    2019年9月17日 xff0c 第二十一届中国国际工业博览会 xff0c 在上海国家会展中心正式拉开帷幕 以 立体视觉技术提供商 身份参展本届工博会的MYNTAI小觅智能在展会现场发布了旗下首款针对AGV量身定制的小觅双目立体避障模组 2
  • 小觅双目摄像头深度高精版发布,精度可达毫米级

    今天 xff0c 第二十一届中国国际工业博览会 xff0c 在上海国家会展中心正式拉开帷幕 以 立体视觉技术提供商 身份参展本届工博会的MYNTAI小觅智能 xff0c 携其小觅深度摄像头旗下深度系列新品小觅双目摄像头深度高精版惊喜亮相 自
  • AGV搬运机器人「眼睛」的未来:3D视觉导航方案

    搬运机器人是可以进行自动化搬运作业的工业机器人 xff0c 也就是人们常提到的AGV 自动引导车 中的一个主流大类 随着工厂自动化 计算机集成制造系统技术逐步发展 xff0c 以及柔性制造系统 自动化立体仓库的广泛应用 xff0c AGV搬
  • 小觅双目摄像头标准版视觉惯性 SLAM DEMO

    说到 vins xff0c 就很难不让人想起另一个通过视觉与 imu 融合的经典 OKVIS 它是由 Stefan Leutenegge 等人提出的基于双目 43 惯导的视觉里程计 xff0c 属于 VIO Visual Inertial
  • 小觅智能 | OKVIS 学习笔记

    上一期的视觉里程计 xff0c 让我们想到了 OKVIS xff0c 知乎上的讨论也比较少 xff0c 小觅智能来分享一下 OKVIS 基本介绍 它是由 Stefan Leutenegge 等人提出的基于双目 43 惯导的视觉里程计 xff
  • 小觅双目摄像头标准彩色版发布 为移动机器人视觉导航避障优化设计

    2019年1月15日 xff0c 小觅智能发布了其双目深度相机系列旗下全新产品小觅双目摄像头标准彩色版 xff08 简称标准彩色版 xff0c 下同 xff09 小觅双目摄像头 标准彩色版 xff08 MYNT EYE S Color xf
  • Vins-Fusion 学习笔记

    VINS Fusion 基本介绍 VINS Fusion 是继 VINS Mono 和 VINS Mobile xff08 单目视觉惯导 SLAM 方案 xff09 后 xff0c 香港科技大学沈劭劼老师开源的双目视觉惯导 SLAM 方案
  • 我是如何通过阿里面试的?

    笔者参加18年阿里春招 xff0c 有幸最终拿到阿里offer xff0c base杭州 xff0c 岗位客户端开发 一直忙于其他事情 xff0c 拿到意向已经过去十多天 xff0c 在此分享一些关于面试的干货 xff0c 攒一波RP xf
  • 运行msckf_vio

    MSCKF vio是一种基于多状态约束卡尔曼滤波器的双目视觉里程计 其中多状态约束是指将多帧图像的相机位姿加入卡尔曼状态向量中 xff0c 在进行卡尔曼增益之前通过多帧图像之间的约束进行最小二乘优化来估计特征点的空间位置 xff0c 然后根
  • 建图 | SVO 论文与代码分析分讲

    建图 xff08 深度滤波器 xff09 VO 把像素的深度误差模型看做概率分布 xff0c 使用 高斯 均匀混合分布的逆深度 xff08 深度值服从高斯分布 xff0c 局外点的概率服从 Beta 分布 xff09 xff0c 称为 深度
  • 机房黑科技:京东数科机房巡检机器人

    6月11日 xff0c 第五届CES Asia亚洲消费电子展在上海正式开幕 京东数字科技携旗下多款机器人产品参展 xff0c 并正式发布了多款全新的智能机器人 其中 xff0c 室内运送机器人可以自主乘坐电梯 xff0c 并能自动导航 避障
  • AI深度 | 3D人脸识别和双目结构光惯导

    文 纽豪斯 发布 AI智道 一文看尽双目摄像 结构光 ToF和激光雷达技术 xff1b 一文深入了解小觅智能 奥比中光 华捷艾米 的卢深视 Pico和镭神智能 xff1b AI赋能2大趋势 4大核心技术 前言 纽豪斯刚刚完成 AI深度 xf
  • 经典笔试题——单向链表的倒序

    题目 xff1a 有一个单向链表 xff0c 将链表倒序 解决方案 xff1a 单向链表的特点 xff1a 链表节点只能从前往后遍历 xff08 不能从后往前遍历 xff09 xff0c 那么在遍历链表时 xff0c 必须从前往后处理这些数
  • 【CAN】手把手教你学习CAN总线(一)

    CAN总线 一 CAN总线概念二 CAN的差分信号三 CAN总线的通信协议1 帧起始2 仲裁段3 控制段4 数据段5 CRC段6 ACK段7 帧结束 四 CAN的位时序1 同步段 xff08 SS xff09 2 传播时间段 xff08 P
  • 【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS

    初识FreeRTOS 一 实时操作系统概述1 概念2 RTOS的必要性3 RTOS与裸机的区别4 FreeRTOS的特点二 FreeRTOS的架构三 FreeRTOS的代码架构 一 实时操作系统概述 1 概念 RTOS xff1a 根据各个
  • 使用结构体方式访问寄存器的原理

    朱老师单片机课程学习记录 3 6 5 使用结构体方式访问寄存器的原理 1 C语言访问寄存器的本质是C语言访问内存 xff0c 本质思路是 xff1a 定义一个指针 xff08 临时变量 xff09 指向这块内存 xff0c 然后 p 61
  • 不需外接硬件,测试自制的串口调试助手

    这里写目录标题 0 写在前面1 下载并安装vspd虚拟串口和串口调试助手1 1 vspd虚拟串口安装1 2 串口调试助手 2 用vspd创建两个虚拟端口3 进行串口调试助手和自己做的串口调试助手的通信3 1 统一参数3 2 助手2发送数据3

随机推荐