主要讲解TCP/IP体系结构:java
Transmission Control Protocol
,即 传输控制协议web
1.属于 传输层通讯协议算法
2.基于
TCP
的应用层协议有HTTP
、SMTP
、FTP
、Telnet
和POP3
编程
首部前20个字符固定、后面有4n个字节是根据需而增长的选项跨域
故 TCP首部最小长度 = 20字节浏览器
三次握手的目的是创建可靠的通讯信道,说到通信,简单来讲就是数据的发送与接收,而三次握手最主要的目的就是双方确认本身与对方的发送与接收是正常的。缓存
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常;安全
第二次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身接收正常,对方发送正常服务器
第三次握手:Client 确认了:本身发送、接收正常,对方发送、接收正常;Server 确认了:本身发送、接收正常,对方发送接收正常cookie
因此三次握手就能确认双发收发功能都正常,缺一不可。
SYN:同步序列编号(Synchronize Sequence Numbers)。是TCP/IP创建链接时使用的握手信号。
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。
双方通讯无误必须是二者互相发送信息都无误。传了 SYN,证实发送方到接收方的通道没有问题,可是接收方到发送方的通道还须要 ACK 信号来进行验证。
SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 创建链接时使用的握手信号。
ACK(Acknowledgement) 确认字符 ,在数据通讯传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。
SYN(synchronous创建联机)
ACK(acknowledgement 确认)
PSH(push传送) FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
SYN表示创建链接,FIN表示关闭链接,ACK表示响应,PSH表示有 DATA数据传输,RST表示链接重置。
举个例子:A 和 B 打电话,通话即将结束后:
1.A 说“我没啥要说的了”,B回答“我知道了”,
2.可是 B 可能还会有要说的话,A 不能要求 B 跟着本身的节奏结束通话,
3.因而 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,
4.A 回答“知道了”,这样通话才算结束。
MSL(Maximum Segement Lifetime)
由于若是不等待的话,若是服务端还有不少数据包要给客户端发,且此时客户端端口被新应用占据,那么就会接收到无用的数据包,形成数据包混乱,因此说最保险的方法就是等服务器发来的数据包都死翘翘了再启动新应用。
User Datagram Protocol
,即 用户数据报协议
属于 传输层通讯协议
基于
UDP
的应用层协议有TFTP
、SNMP
与DNS
HTTP
协议 属于 应用层HTTP
协议采用 请求 / 响应 的工做方式注:空格不能省
此处特地说明GET、PSOT方法的区别:
采用”header(字段名):value(值)“的方式
1. 请求和响应报文的通用Header
常见请求Header
做用:存放 需发送给服务器的数据信息
使用方式:共3种
其中,空格不能省
具体介绍
相似
相似
主要区别主要体如今:
缓存处理,
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来作为缓存判断的标准,
HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
带宽优化及网络链接的使用,
HTTP1.0中,存在一些浪费带宽的现象,
例如客户端只是须要某个对象的一部分,而服务器却将整个对象送过来了,而且不支持断点续传功能,
HTTP1.1则在请求头引入了range头域,它容许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和链接。
错误通知的管理,在HTTP1.1中新增了24个错误状态响应码,
如409(Conflict)表示请求的资源与资源的当前状态发生冲突;
410(Gone)表示服务器上的某个资源被永久性的删除。
Host头处理,在HTTP1.0中认为每台服务器都绑定一个惟一的IP地址,所以,请求消息中的URL并无传递主机名(hostname)。
但随着虚拟主机技术的发展,在一台物理服务器上能够存在多个虚拟主机(Multi-homed Web Servers),而且它们共享一个IP地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中若是没有Host头域会报告一个错误(400 Bad Request)。
长链接,HTTP 1.1支持长链接(PersistentConnection)和请求的流水线(Pipelining)处理,
在一个TCP链接上能够传送多个HTTP请求和响应,减小了创建和关闭链接的消耗和延迟,
在HTTP1.1中默认开启Connection: keep-alive,必定程度上弥补了HTTP1.0每次请求都要建立链接的缺点。
改进性能:
Connection: keep-alive
TCP/IP
协议族通讯的中间软件抽象层,表现为一个封装了 TCP / IP协议族 的编程接口(API)
Socket
不是一种协议,而是一个编程调用接口(API
),属于传输层(主要解决数据如何在网络中传输)对用户来讲,只需调用Socket去组织数据,以符合指定的协议,便可通讯
Socket ={(IP地址1:PORT端口号),(IP地址2:PORT端口号)}
Socket
实例 惟一表明一个主机上的一个应用程序的通讯链路url
地址 ->> 显示主页的过程Internet
中的每一台主机(或 路由器)的全球惟一的标识符其中:
- 网络号:标志主机(或路由器)所链接到的网络。一个网络号在整个因特网范围内必须是惟一的。
- 主机号:标志该主机(或路由器)。一个主机号在它面前的网络号所指明的网络范围必须是惟一的。
不一样类型的IP地址,其主机号 & 网络号所占字节数不一样;故:一个IP地址在整个网络范围内是惟一的
区别在于网络号 & 主机号占的字节数不一样
Internet Control Message Protocol
,即 网际控制报文协议
- 属于IP层协议
- 注:ICMP报文不是高层协议,而是做为IP层数据报的数据,加上数据报首部,组成IP数据报发出去
同时容许主机 / 路由器报告差错 & 异常状况
分类 ICMP
差错报告报文 & ICMP
询问报文
主要应用 PING(分组网间探测)、Traceroute(跟踪1个分组从源点到终点的路径,
原理 = 从源主机向目的主机发送一连串的IP数据报)
下面,将主要介绍Ping
的过程
Packet InterNet Groper
,即 分组网间探测是
ICMP
报文的一个重要应用:使用了IPCM回送请求 & 回送回答报文
Cookie
cookie 是一个很是具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。
因为cookie是存在客户端上的,因此浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,因此每一个域的cookie数量是有限的。
Session
session 从字面上讲,就是会话。
这个就相似于你和一我的交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方确定有某种特征(长相等)代表他就是张三。
session 也是相似的道理,服务器要知道当前发请求给本身的是谁。
为了作这种区分,服务器就要给每一个客户端分配不一样的“身份标识”,而后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。
至于客户端怎么保存这个“身份标识”,能够有不少种方式,对于浏览器客户端,你们都默认采用 cookie 的方式。
服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来讲更安全。
但是session有一个缺陷:若是web服务器作了负载均衡,那么下一个操做请求到了另外一台服务器的时候session会丢失。
Token
在Web领域基于Token的身份验证随处可见。在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式。
如下几点特性会让你在程序中使用基于Token的身份验证
那些使用基于Token的身份验证的大佬们
大部分你见到过的API和Web应用都使用tokens。例如Facebook, Twitter, Google+, GitHub等。
基于服务器验证方式暴露的一些问题
NoSession意味着你的程序能够根据须要去增减机器,而不用去担忧用户是否登陆。
基于Token的身份验证的过程以下:
无状态、可扩展
基于这种无状态和不存储Session信息,负载负载均衡器可以将用户信息从一个服务传到其余服务器上。
若是咱们将已验证的用户的信息保存在Session中,则每次请求都须要用户向已验证的服务器发送验证信息(称为Session亲和性)。用户量大时,可能会形成一些拥堵。
安全性
请求中发送token而再也不是发送cookie可以防止CSRF(跨站请求伪造)。
即便在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。不将信息存储在Session中,让咱们少了对session操做。
token是有时效的,一段时间以后用户须要从新验证。咱们也不必定须要等到token自动失效,token有撤回的操做,经过token revocataion可使一个特定的token或是一组有相同认证的token无效。
可扩展性
Tokens可以建立与其它程序共享权限的程序。例如,能将一个随便的社交账号和本身的大号(Fackbook或是Twitter)联系起来。当经过服务登陆Twitter(咱们将这个过程Buffer)时,咱们能够将这些Buffer附到Twitter的数据流上(we are allowing Buffer to post to our Twitter stream)。
使用tokens时,能够提供可选的权限给第三方应用程序。当用户想让另外一个应用程序访问它们的数据,咱们能够经过创建本身的API,得出特殊权限的tokens。
下面,将详细讲解TCP
协议的无差错传输
对于发送端:
1.每收到一个确认帧,发送窗口就向前滑动一个帧的距离
2.当发送窗口内无可发送的帧时(即窗口内的帧所有是已发送但未收到确认的帧),发送方就会中止发送,直到收到接收方发送的确认帧使窗口移动,窗口内有能够发送的帧,以后才开始继续发送。
对于接收端:
1.当收到数据帧后,将窗口向前移动一个位置,并发回确认帧,若收到的数据帧落在接收窗口以外,则一概丢弃。
类型1:停等式ARQ(Stop-and-Wait)
即 :发送窗口大小=一、接收窗口大小=1
- 发送方每发送一帧,要等到接收方的应答信号后才能发送下一帧
- 接收方每接收一帧,都要反馈一个应答信号,表示可接下一帧
- 若接收方不反馈应答信号,则发送方必须一直等待
类型2:后退N帧协议
也称:连续ARQ协议
即 :发送窗口大小>一、接收窗口大小=1
本示例 = 源站 向 目的站 发送数据帧。具体示例以下:
类型3:选择重传ARQ(Selective Repeat)
即 :发送窗口大小>一、接收窗口大小>1
相似于类型2(后退N帧协议),此处仅仅是接收窗口大小的区别,故此处不做过多描述
因而可知,若信道传输质量不好,致使误码率较大时,后退N帧协议不必定优于中止-等待协议
流量控制
拥塞控制
拥塞:对网络中的资源需求 > 该资源所能提供的部分
与 “流量控制”的区别
其中,涉及4种算法,即 慢开始 & 拥塞避免、快重传 & 快恢复
预备知识:
拥塞窗口
慢开始算法
拥塞避免
慢开始 & 拥塞避免
(cwnd)
按线性规律 缓慢增加:每通过一个往返时间RTT
,发送方的拥塞窗口(cwnd)
加1
- 拥塞避免 并不可避免拥塞,只是将拥塞窗口按现行规律缓慢增加,使得网络比较不容易出现拥塞
- 相比慢开始算法的加倍,拥塞窗口增加速率缓慢得多
(cwnd)
增加过大而引发网络拥塞,采用慢开始 & 拥塞避免 2种算法,具体规则以下预备知识:
快重传算法
原理
做用
因为发送方尽早重传未被确认的报文段,所以采用快重传后可使整个网络吞吐量提升约20%
示意图
快恢复
当发送方连续收到3个重复确认后,就:
(ssthresh)
设置为 出现拥塞时发送方窗口值的一半 = 拥塞窗口的1半(cwnd)
值设置为 慢开始门限ssthresh
减半后的数值 = 拥塞窗口的1半注:
- 因为跳过了拥塞窗口
(cwnd)
从1起始的慢开始过程,因此称为:快恢复- 此处网络不会发生网络拥塞,因若拥塞,则不会收到多个重复确认报文
快重传 & 快恢复
图片来源:《图解HTTP》
https://juejin.cn/post/6844903592965439501
https://juejin.cn/post/6844903662838349838#heading-14