内网是如何做到的?
答:内网是指局域网内的网络可以相互访问的概念。内网开启一个服务器,因其IP是私网IP, 如果不是在同一网络下,是找不到该服务器的MAC 地址的。只有链接到相同网段的网络, 利用ARP广播才能找到 改服务器的mac地址。
后台布置的开发服务器 和我们自己电脑开的 sever 有啥区别? 后台布置的开发服务器 是私网IP吗? 自己的sever 开的服务 是 私网IP。 因为 私网ip 存在 。 会导致私网ip 相同, 因为 同一网段请求 不走路由 , 可以直接 arp 直连寻mac地址。 那我是不是 内网的接口 到别人家公司 也能请求到? (很荒谬的问题, 但是 就是想知道 存在这种可能性 对吧?)。
答:后台布置的开发服务器一般都是放在自己公司内网的私有IP 上。跟我们自己的电脑开启的服务器是一样的。确实是 可能会出现乌龙现象。
NAT PNT.
答: 因局域网的IP 是私有IP 为解决ip地址不够用问题。所有的私有IP电脑想访问互联网需要再路由器进行 公网IP转换。这个转换称之为 NAT。
公网ip 私网ip
答:如果 世界上所有的IP 地址 都是唯一的, 每一台主机分配一个独一无二的IP 。那么IP 地址是不够用的,为解决 IP 不够用的的问题, 局域网的IP 都是重复的, 有几个号段 被分为局域网IP。
路由间ARP 是采用动态路由 方式 找到链接路径。 然后 在最后的 路由 发送ARP 寻mac地址。
路由直接传递 采用ppp 协议 ppp协议 没有包装 源MAC地址 和 目标mac地址。 那传过去的 数据 到最后的 的时候 如何 找到 私有mac 地址呢? arp 协议的时候 传递了吗?
TCP 拥塞控制。 流量控制。
http1.0, 1.1, http2.0的区别?
答:http1.0 超文本传输协议。无状态:服务器不跟踪不记录请求过的状态 ,无连接:浏览器每次请求都需要建立tcp连接,发送请求 三次握手 ,四次分手,客户端主动链接服务端,每次发送http请求 都必须 建立一次新的TCP链接。
http 1.1 :长连接。持请求管道化(pipelining)。此外,HTTP/1.1还加入了缓存处理 新的字段如cache-control,支持断点传输 range,以及增加了Host字段(使得一个服务器能够用来创建多个Web站点)。
可以做到 建立一次TCP连接,发送多次http请求。 缺点是 http请求 是同步的, 必须一次 请求完毕,再发另外一个。浏览器 如果想实现并发请求,就是建立多个并发连接。浏览器 最多针对同一个域名 六个链接。请求应答模式,只能客户端主动发起请求。(同一次会话) 每次TCP链接完成之后 发送多次HTTP 请求都携带重复的 请求头信息。(同一次会话 是指 http1.1 的建立一个tcp 链接发送多个http请求,是建立在相同 域名情况下的 http请求。 如果不是一个域名的 不能一起);
SPDY http2.0 前身, http应用层 构造数据完毕后 发送到 SPDY层 在发送给TCP 层。
http2.0 采用二进制格式传输数据,把 header 和body 数据部分 拆成两个二进制流。将header 和body打散。
http2.0 多路复用。 请求 利用一个tcp 通道。 发送多个http请求, 每个http 请求也被分成多个帧,可以并发的 出现在发送链路上。 (不管是 http 1.1 还是http2.0 的 一个tcp 通道 里面传输的http 请求 都只能是 一个域名下的,也就是可以理解为 http 请求的TCP 通道 是建立在同一域名下的。)
http 2.0 优先级。
http 2.0 头部压缩 ,HPACK算法技术,实现头部信息压缩。http2.0 http报文多帧交错发送, 后面发送的 可以 标识 我跟上次发送的 头部信息比较 差异点 发送, 不需要携带 相同的信息。
http 2.0 服务器推送,服务器对客户端一次请求 多次响应。
http 2.0 队头堵塞问题。 采用TCP协议。 需要确保数据安全性,数据发送之后 需要确保 本次发送成功 才会继续发送下一个段,尽管http2.0 会将http 包分成 多个报文发送给TCP。但是TCP 在发送这些数据的时候 还是要求确保 之前传递过去的 重传成功 才会 处理后面传递的。这是TCP在报文传递失败 需要保证重传技术导致的,不是http 2.0的问题。
后采用QUIC 协议 可以解决这个问题。 QUIC协议 采用的是 UDP传输层协议。
QUIC 协议 就是 http3.0采用的技术。 更新了 HPACK算法 压缩header 信息改变为 QPACK算法。TCP协议更换为UDP协议
UDP 不靠谱 ,由QUIC协议保证 可靠性。
Http2.0 握手延迟问题。
HTTP3.0 特性, 链接迁移,网路由4G切换到WiFi 原HTTP 是会链接超时,在重新建立连接的。会出现网络错误的提示。 HTTP3.0 的QUIC协议 是利用UDP 协议的 , 采用一组connect id 记录的 链接, 只要id 不变化, 就会维持链接不断开。
基于HTTP 1.1 和 2.0 可以优化网络的 方案。
影响一个网络请求的因素主要有两个,带宽和延迟
- http 1.1 TCP 通道上请求是同步的,可以多开几个TCP 链接 。发起并行请求。(手机端 是不是的http 层 在 framework 里面 他会开几个tcp 链接 不知道。但是可以确定的是 域名不同绝对不是一个通道)
- 减少请求数量,web端 指合并多个CSS/js 文件,或者讲CSS/js文件内置到html里面, 手机客户端优化方向是 减少 页面请求数量,合并多个请求为一个接口。(针对http1.1的优化)。
- 小图片 采用 base64编码图片 来解决 url 向服务器请求图片的过程。
- 其他列表页面 多图片页面,采用 图片 多个域名方式,开启多个TCP通道 请求方式。
手机客户端 http 请求 问题
问题1: http 1.1 请求 浏览器 针对同一域名 最多是开六条TCP连接 去发起请求, 那么苹果手机呢? 最多开几个TCP http连接?。(ios 可能是 根据 你开的线程 开一条线程 是一个TCP 链接。也能使 nsurlsession 设置的 连接池)(如果这样 AFN 每一个对象是不是就是一个 线程。那 如何控制最大线程数呢?)
问题2: HTTP 的json 请求和form 表单请求的区别。 报文层面的区别。
答:json请求和from 表单请求 是指http 超本文传输协议的报文的 data 数据行的封装格式不同 from表单是 用=号链接的 key 和value。 json请求是 数据行是 json字符串。
问题3: https 和 tcp 顺序
答: 看似上下层 其实类似 你如果采用Httt协议。 TCP 会先三次握手。第一次握手交换一些信息。
问题4: 客户端 如何选择 是使用http 1.1 还是 http 2.0 。
答: 是ALPN 协议, 是在TLS交互的时候 服务端 告知 客户端 服务器是 什么版本 的请求。(https 有tls 协议。 http 没有用这个协议啊?)
TCP 传递数据 过大, 是TCP 分段 还是 传递到 数据链路层 再分?
答: http 1.0、1.1 版本 都是TCP 会先分段发送。2.0 版本 直接在http层 就把数据分成了帧。因为TCP 需要可靠性传说, 拥塞控制等 需要控制包大小。所以在上层TCP 就分割了数据。
ANF 如何确定respose 首部
跨域知识, 客户端如何操作跨域
服务器集群 。
抓包软件 为什么 电脑端 不需要设置网络代理 直接可以抓包。 2.为什么手机需要配置代理。3.为什么手机配置代理 还需要在同一WiFi下。
CDN 是把静态文件放到CND 服务器吗? 还是缓存过去的? 为啥会有一些文件是CDN 开头的域名? 动态数据接口呢? 做不到这个功能啊?
答:CDN 加速 ,是指 采用了CDN 的服务器,在用户访问 静态资源的时候 ,离用户最近的CDN节点 会把 缓存 的静态资源文件直接返回,不需要在请求到根服务器,减轻服务器压力。对于这些静态资源 更新问题 这里暂且不表,总之他会有自己的请求头设置文件过期的。 针对 post get put 等接口请求的 无法做到加速。 还有一种 直接把静态文件放到CND 服务器上去,这种就是纯静态资源文件了。 一般第三方或者是静态开源库的 可采用的加速下载方式。eg ios 的cocopoads 有CDN 源, 就是 下载的url 从github 切换到cdn 上去。
TCP 和UDP 服务器 可以是一个端口吗?(TCP/UDP 是传输层协议。 服务器是针对端口进行监听,所以一个服务器 应该是 可以既监听 TCP 又可以监听 UDP 。网络层来了之后针对)
答: 可以。 因为在在服务器上 TCP 和UDP 在内核层面 是两个独立的应用程序。TCP和UDP 是属于传输层协议。 可不可以监听同一端口 是客户端再发消息给服务端的时候 服务端能否区分出来 是 发给UDP还是TCP 的数据,转给发给哪个协议处理数据。服务端的传输层数据是网络层数据传递过来的。 IP协议 规定 在IP 包的首部里面 有一个位置 记录了 传输层数据 采用的协议是什么。所以在ip层就能区分出是UDP还是TCP。
「多个 TCP 服务进程可以绑定同一个端口吗?」
这个问题的答案是:如果两个 TCP 服务进程同时绑定的 IP 地址和端口都相同,那么执行 bind() 时候就会出错,错误是“Address already in use”。但是如果
「同一个服务器可以有多个IP吗?」
答:可以,拥有俩个网卡的机器 可以设置不同的IP。
客户端的端口可以重复使用吗?
答:可以的, 端口可以在不同IP的服务器上重用。
域名可以直接映射到某个端口?eg:我服务器开了俩端口的监听的。我如何用俩域名分别直接请求到 该端口上?
加密 的加盐 是什么意思。
代理后 cookie 如何设置 (会导致不代理后 也能带cookie吗?)? 保证 不失效。
mac地址和IP 都是唯一的 为什么还需要俩个东西。
答: IP地址不唯一 有私网IP 概念。 在互联网上只有公网IP 才可以被识别。我们两个局域网的 设备通信 其实 是利用NAT 技术 把私网IP 转换为公网IP 发送消息。属于网络层。理他IP 准确找到另一端的路由。 然后 通过路由的本地网络之间 通过MAC地址通信。二者缺一不可。
网络 琐碎知识点
基础知识点:集线器,网桥,交换机。 顺序是随着时间推移的。 目前家里的网线布置和公司网络布置采用交换机和路由器方式。 集线器 HUB单通信相当于网线单双工通信 (只有一个通道,发消息就不能同时接消息)。 网桥稍微有点智商,可以记录一下要去mac 地址在他左侧右侧 (但是他只有俩口)也是半双工通信 。交换机 相当于 网桥和集线器 组合, 有多个接口, 可以记录mac地址在哪条线上。全双工通信。
MAC 地址, IP地址 , 子网掩码 ,网段,子网,超网。
MAC 地址 6字节 数字。 一台电脑 一个mac地址, 全世界唯一, 对应一个网卡。 前三字节 iso 颁布 ,后三个字节 厂商自制。 所以发网络 最后寻找 mac 地址 才能找到最终要发消息的电脑。 (IP 不唯一 “私网IP”的原因)
IP地址 分两部分组成 eg:192.168.1.1 网络ID和 主机ID 。 用点分开 四部分, 每部分站一个字节取值 0~255 。 网络ID 和主机ID 怎么划分这四部份,需要条件。
IP 根据条件 划分为 四类。
A类网址:第一个 192 的取值范围 在0~127 之间的 为 A类网址。 A类网址后面三个数都是 主机ID 只有第一个数是网络ID。
B类网址:第一个 192 的取值范围在 128~191 之间的为B类网址。B类网址后面三个数都是主机ID 前两个是 网络ID
C类网址:第一个数 192的取值范围在 192~224 之间的为c类网址。C类网址 最后一个数为主机ID 前三个是 网络ID
D类网址:~~~~~~~~~~~~
子网掩码 : 用来求出 ip 所在网段的东西。 也是4字节的一段数字。一般是 255.255.255.0 这种 就是 C类网址的子网掩码。
网段: IP & 子网掩码 求出来的 值。一般子网掩码的主机ID部分都是0 。 所以&出来的网段 主机部分都是0. 所以根据子网掩码很容易看出IP是哪类网址 ,反推易可。(没有子网和超网的情况)。
同一网段的计算机可以直接通信。 一个路由器后面连着的计算机属于同一网段。
主机ID: 就是某一个网段下 可以放的最大计算机数量。
子网:让一个ip 可以拥有更多 计算机。往主机ID 移动一个子网掩码。
超网:让一个ip 可以减少计算机数量。 往网络ID 移动以为子网掩码。
相反的操作。 同一个网段, IP和子网掩码的变化 , 让主机ID 变多变少的操作。
公网IP 私网IP
公网IP 唯一。
私网IP 不唯一,局域网设置的IP。大家的路由器直连 一般都是192.168.1.1 就是路由器的 ip。都一样 192.168.0.0~192.168.255.255 之间都是 私网IP。
NAT
私网IP转换公网IP.在请求的时候 在路由器的时候会把 私网IP 转换为 公网IP。
分层: 物理层->数据链路层->网络层->传输层->应用层
物理层:指的是 我们真实生活中物品 eg:网线,路由 ,交换机,集线器等。规定了 接口定义 线缆标准,传输速率等。
数据链路层: 就是我们传输的网络数据 经过路由器 交换机 主机 之间的链路。常用的有 路由器和路由器直连的链路 采用的是ppp协议封装数据。 路由器和主机,路由器和交换机 ,交换机和主机之间的链路是采用CSMA/CD 协议传输数据。以太网 2.0协议。 (这里协议是指 对数据进行一层包装(就是添加首部和尾部。后面具体介绍)然后再链路上传递 不同的协议 包装方式不同)。
网络层:网络层是指 对数据进行包装,切割为多组数据包 传递给下层数据链路层,因为传递给数据链路层的网络层数据有最大限制 1500字节 。网络层主要功能为 对数据进行包装 , 切割。 常用协议 ARP,IP ,ICMP 协议。
传输层:对运输层数据进行包装。网络连接等操作。 TCP UDP 协议。
应用层: 要传输的数据的处理。 post get 等请求方式不同 处理方式不同。 http https DNS FTP .
物理层 知识点
单工通信 :信号只能一个方向传输。
半双工通信:信号可以双向传输, 但是 同一时间只能一个方向上有数据。
全双工通信:信号可以双休传输, 同一时间 既可以收消息 又可以发消息。
数据链路层
链路: 网线 一个节点到另外一个节点的物理线路称为链路。eg:PC和路由器之间的线路。 PC 和交换机之间的线路。 交换机和路由器,路由器和路由器。特殊 PC和交换机,交换机连着路由器 ,这两段可以合称为一个线路。
在每条链路上传递数据 需要特殊的通讯协议。 不同的链路通讯协议不同。eg CSMA/CD ,PPP协议。 CSMA/CD 协议是 集线器连接的协议。 交换机连线的类似,又不同。
数据链路层协议 特点
封装成帧:对IP网络层传递过来的数据包 封装成帧,添加 首部和尾部。
透明传输:数据链路层 CSMA有帧开始符,帧结束符,防止网络层数据中有帧开始符和帧结束符,对数据进行补充字符。
差错检验:防止数据被修改。 FCS (4字节), 帧首部计算得出的FCS 的值。验证不通过 ,网卡不会继续往上传,不会传给服务器。会报错。 属于尾部。
MUT最大传输单元,规定网络层传递过来的数据不得超过 最大传输单元 ,以太网传递最大MUT为1500字节。
CSMA/CD协议
- CSMA/CD协议封装的数据又称以太网帧。(目前使用的是Ethement V2标准,没有帧开始和真结束符号,也就不用补充字节了。透明传输是不是也就没用了?)
- 以太网帧 至少64字节。 为了能做到防止冲突,知道是别人发给我的 还是我自己发送的 冲突后返回给我的数据帧。保证可以一个来回。
- 以太网帧 是对网络层传递过来的数据 机型包装, 包括 首部,数据,尾部FCS。 FCS占 4字节。
- 首部包括 目标MAC地址,源MAC地址,网络类型IPV4还是ipv6。首部大小为 6字节+6字节+2字节 = 14字节。 类型占2字节。 又因为 以太网帧 最小为64字节 所以 要求 网络层数据最小为 64-14 -4=46字节。如果网络层数据小宇46字节,数据链路层会补充到46字节。最大是 1500 字节。所以以太网帧 范围是 46~1518之间。
PPP协议 :点对点协议。 两个路由器之间的数据传递。一根网线直连的链路。
- 对网络层数据包装 添加 首部和尾部FCS 。
- 首部 不包含 目标MAC 和源MAC。 有帧开始 和帧结束符号。
网络层 (IP协议,ARP协议,ICMP协议 ping走的协议)
- 网络层包装好的数据 称为 包。 (以下是对IP协议进行解析,其他类似,)
- 网络层 大多数是对传输层数据进行包装。添加首部。所以网络层的数据包括两部分 首部+ 数据。(为什么说大多数数据是从传输层传递下来的呢?是因为有些操作的数据不是从传输层包装传递下来,而是由网络层自己构造数据的,eg:ICMP协议和ARP协议,他们还有不同。ICMP在网络层 按照传输层结构构造数据。 ARP 的数据部分 跟传输层接的数据又不相同。具体没深入了解)
- 网络层首部 分为 固定部分 20字节 +可选部分(大多数没有这部分)。
- 网络层首部 20字节解析:
- 版本 0.5字节 4个2进制位表示。 ipv4 /ipv6。
- 首部长度。0.5字节 4个2进制位表示。需要乘以4一个数得到真实的长度。所以 网络层首部长度范围是 20~60字节之间。
- 区分服务。一个字节。可以增加处理优先级。操作系统级别。
- 总长度。2字节
- 标识。2字节 ,因为数据过大 ,需要分片。这个字段相同表示一个数据包的分片数据。
- 标志。3个二进制位。分别是保留位。是否分页。是否是最后一页。
- 片偏移。12个二进制位。记录片偏移,开始的位置
- 生存时间。TTL 经过路由器的个数, 当这个值减少为0的时候 就返回错误。一般都够用, 为了防止死循环。eg 路由表配置默认路由 俩路由相互踢来踢去。
- 协议。记录封装的数据包采用的协议是什么协议 1字节。eg 0 是CSMA/CD。 6是TCP 协议。
- 首部校验和。数据校验。
- 源IP。
- 目标IP。
- 网络层首部 20字节解析:
传输层
- 传输层可以理解为。客户端和服务器之间通信。怎么通信啊 ,我怎么让服务端知道我要发消息了。 还要让服务端知道 我发的消息都发过去了。怎么建立连接,怎么取消连接。 确定 客户端和服务端如何发送数据的。
- TCP 和UDT 都属于传输层协议。 他们区别为:
对比例 | TCP | UDP |
---|---|---|
连接性 | 面相连接 | 无连接 |
可靠性 | 可靠传输,不丢包 | 不可靠传输,可能丢包 |
首部占用空间 | 大 | 小 |
传输速率 | 慢 | 块 |
资源消耗 | 大 | 小 |
应用场景 | Http,件传输FTP,邮件发送 | 音视频通话,直播 |
应用层协议 | Http,Https,FTP,SMTP,DNS | DNS |
UDP协议。
无连接,减少建立和释放连接的开销。
尽最大能力交付,不保证传输成功,可能丢包。
UDP segment 数据包 首部 八字节。TCP 至少20字节。
UDP segment段 数据的 首部内容。8字节。
源端口号, 目标端口号, UDP 长度 ,UDP 检验和。 都是16位二进制。2字节大小。
源端口:客户端临时开启的随机端口。用于请求接受返回数据匹配哪次请求的。
目标端口: 取值范围0~65535 2字节代表最大数。是指服务器 监听的端口。tomact 监听的端口。
UDP长度:首部长度+数据长度。
检验和:伪首部+首部+数据 得到。 虚拟首部有源端口目标端口协议等。
协议 | 默认端+口号 |
---|---|
Http | TCP+80 |
https | TCP+443 |
FTP | TCP+21 |
MySQL | TCP+3306 |
DNS | TCP/UDP+53 |
SMTP | TCP+25 |
POP2 | TCP+110 |
TCP协议。
TCP协议是传输层协议,对应用层数据进行包装,构造传输方式,与服务器建立连接的协议。
面相连接,传递数据前需要先建立连接,确认连接通道。
可靠性高,保证不丢包,会有数据包重传概念。
UDP segment 数据包 首部 八字节。TCP 至少20字节。
TCP协议首部 至少20字节 包含以下部分。
- 源端口:
- 目标端口:
- 序号:除开三次握手四次分手 的连接 之外,正式发送请求的过程中的TCP段数据,的时候,序号代表的含义是 此次发送的数据部分的第一个字节编号。 把应用层的数据算作一个整体。对他们的字节流进行编号。如果出现数据过大 分割发送的时候 序号就会变化。
- 确认号:同样 建立连接后的含义 是 代表 我接下来期望你给我发的数据的第一个字节编号是哪个?(http1.0的时候,发送端(可以理解为客户端)发送数据分包的时候这几个分包发送是同步的,是需要在发送给接收端之后,接收端返回个消息给发送端,发送端再去接着发送第二部分分包,这个返回确认接收到了的消息携带ACK序列号)
- 数据偏移(也就是首部长度):TCP首部总大小。固定首部大小20字节。4位2进制位表示,0x0101---0x1111,取值5~15之间。这个值乘以4代表首部大小。 跟网络层IP协议的首部大小一样。都是20~60字节的大小。
- 保留位:
- 标志位:6个二进制位标识,一个二进制位代表一个。分别是URG(urgent,紧急)、ACK、PSH(push,)、RST(reset 重置)、SYN(syn,同步)、FIN(finish,结束),等标识。代表本次数据包是做什么用的
- 窗口:
- 检验和:和UDP一样的计算方式 。伪首部+TCP首部+数据大小。
- 标志指针: 存的是一个 长度, 当标志位 URG 为1 的时候,才有意义,代表的是 TCP 数据部分的 部分前多少位是紧急数据。
TCP特点
- 可靠传输。面相连接,不丢包。
2 流量控制。
3 拥塞控制。
标志:1. URG(urgent)紧急指针, 当为1 的时候,首部的紧急指针位置才有值, 保证优先传输。
2 ACK:确认标志位,当确认标志位位1 确认号才有意义。
3 PSH (PUSH) 一般用于交互式网络,很少有。
4 RST (reset)重置。 当RST 位为1的时候 ,表征TCP连接出现严重错误,需要重新建立连接。
5 SYN 同步,用于请求建立和释放连接作用。
客户端发送到服务端:SYN为1 ACK 为0 代表 第一次握手,序列号seq 为随机数Q。客户端处于等待状态, 服务端从listening接收这个消息包。 客户端告知服务端我要建立连接啦。
服务端发送到客户端 :SYN 为1 ACK 为1 代表第二次握手,序列号 seq 值 是 随机数R,ACK的确认号位置发送个Q+1。然后服务端发完这个消息就处于 等待状态。 服务端告知客户端 我知道你要建立练级,我收到你的消息啦。 你能收到我消息吗?
客户端 在收到服务端第二次握手的消息后, 在构造个 ACK 为1 SYN 为0 ,序列号seq为Q+1并且确认号是 上一步的序列号seq+1的值发送给服务端, 告知服务端。我也能接到你的发的消息。 然后服务端接收到 此次客户端消息之后 就知道了 吖 咱俩互相都可以接收到对方消息, 那么你发消息给我吧, 就处于等到客户端发消息阶段了,客户端再发送过ACK消息后等待2个ATT之后 如果没有接收到 其他服务端消息 就开始发送请求。
然后客户端 就把数据传递给网络层-》数据链路层 开始传递消息。
TCP 可靠性传输- 自动重传ARQ协议 (http1.0的 效率低)
- ARQ (automatic repeat -reqeust) 自动重传请求。
为保证可靠传输,发送数据不丢包, HTTP 1.0 也可以理解为TCP 早期版本 发送数据段时候 是同步的,同步的概念就是一个TCP 数据段 (段 是传输层数据的简称)可能过大, 分成 几个段发送, 那么这几个段在发送的方式上采用同步方式,就是 我 先传一个段到接收端,接收端再发一个确认消息到发送端,告诉发送端我接受到了这个段, 然后发送端在接收到这个消息之后 在发送第二段。
所以这一个完整流程包含两个方向的丢包可能。1客户端发送到服务端的数据丢包,2 .服务端回复给客户端的消息丢包。
在1情况下。 客户端在发送消息之后会处于等待状态,如果等待超时 的时候,就再次把这个数据段重传。ARQ自动重传协议。
再2 情况下 。服务端接到消息了, 在回传给客户端的消息丢包了。 客户端仍然是等待超时,再次把这个数据段重传。不过此时服务端已经收到过这个数据段了,服务端会自己处理忽略掉本次传递的数据,返回客户端收到ACK消息。ARQ自动重传协议。
3.服务端发送确认消息 也有可能 太慢了。 超过客户端的超时时间了。同样客户端还是会重传信息,同理服务端接受俩条相同信息会忽略最后一次消息。返回确认消息。 这样客户端可有可能接到两次相同的确认消息, 会自动忽略掉最后一次确认消息。
TCP可靠性传输-连续ARQ协议+滑动窗口协议(http2.0的 效率高)
缓存概念:TCP 发送消息 有一个缓存机制,缓存区。缓存着要发的数据。
滑动窗口:TCP数据首部有一个窗口字段,告知接收端目前缓存区大小。客户端在发送消息的时候,服务端会告知目前窗口大小。然后客户端根据窗口大小,可以同时 传几个数据包 到服务端。这几个包一起发送完毕后 服务端会统一给一个ACK确认消息,然后客户端 再把窗口根据ACK确认消息 往下移动, 发送下一组消息。
SACK :选择性确认技术。 利用TCP 首部的非固定40字节 来让发送端知道 我接收到 哪些数据,哪些数据没接收到。原理就是发送端 发送了连续的 几个段的包到接收端, 接收端再接收完毕后 回复发送端ACK 信息, 并告知发送端我期望你接下来发送的段是从什么编号开始。 这一步是告知发送端 这个ACK 之前都是连续的 我都已经接到了。 后面的段时不连续的,然后在TCP 首部 非固定字段里面 添加 左边界+右边界 告诉你 我哪些是已经收到过的 可以不重发这些。
状态码
100部分
1.100 continue 请求的初始部分已经被服务器接受,期待客户端继续发送请求部分。
2 101 切换协议,服务器将遵从客户端请求,切换协议。
200部分
200 成功。
201,接受请求,并且创建了新的资源
202,接受请求,但是尚未处理。
203,已接收请求。但是返回的信息是来自其他网站,(跳转的时候提示 不是本网站信息)。
204 服务器接受了请求, 但是没有返回内容, 网站无需变化 类似表单提交,提示已经提交成。
205 类比204一样, 但是需要网页 请求输入内容。
300 重定向。
301 永久重定向。 URI期望你以后都变换了在请求, (场景, 浏览器书签什么的更新掉)
302 短暂性重定向,本次
303 短暂性重定向
304, 内容未修改。无需更新。
307 短暂性重定向 切换 get 为post 。 目前 基本 302 303 307 都会自动切换到post 请求。
400。
400 请求报文错误。java开发人员 也可以主动的返回状态码 400。
401 身份验证。
403 服务器拒绝请求。 权限不够。
404 找不到资源。
405 请求方法不对。(服务器支持,但是java后台不允许)
406 无法根据请求的header 配置的特性 相应请求。
411 服务器不接受不含有效内容长度的header 请求。
500 服务器遇到意外情况并阻止其执行请求
501 请求方法不被服务器支持。
503 服务器宕机 处理不过来。
跨域: 同源策略 引起的 ajax请求 被拒绝。 同源策略要求 JS请求的时候 请求的接口必须跟自己是在同一服务器上的, 同源策略: 协议+域名(IP)+端口 相同。
解决方案:
-> CORS Cross-Origin Resource Sharing ,跨域资源共享。
-> CORS的实现需要客户端和服务器同时支持。
客户端 浏览器都默认支持。
服务器:
设置响应头 Access-Control-v-Origin 设置可以跨域访问。 客户端请求头里面有个origin 浏览器会自动携带 请求是来自那个网址。
TCP 可靠性,流量控制, 拥塞控制(慢启动,拥塞避免,快重传,快回复)。
可靠性: TCP 协议 是 有链接的特性,会保证数据包 一定到达对方,采用的是连续ARQ 协议和滑动窗口协议 实现 可靠性 重传机制。SACK 技术 ,接收端接收数据的时候以一个缓存窗口为单位,这个过程中 如果有包没传过来, 需要重传机制。慢启动,拥塞避免,快重传,快回复 网上一大堆。
socket: 不属于协议, 而是 基于TCP和UDP 开发的接口API。 属于系统内核API ,可以实现长连接。各个平台语言都针对该接口封装了 各自平台的 socket。实现代码 调用TCP 协议 和服务器 建立自己的 长连接。
websoctet: H5 提出的一个 协议。 浏览器基本支持。 搭配HTTP协议三次TCP握手之后, 转换为websocket协议。 需要客户端支持 协议转换 返回httpcode 100操作。 普通的socket 服务器 是不能直接 链接websocket的。
HTTPDNS 。
FTP : 文件传输协议。 俩个端口 链接。 显示连接端口 然后再用另外端口发送数据。主动模式 被动模式两种。 以ftp:// 开头的url FTP协议 服务器 端口 是20 接收连接命令的端口。 发送数据的端口 主动模式 是21 端口, 被动模式 是一个随机端口
最终总结: 浏览器输入个网址 的整体过程。
1