首先了解OSI七层体系结构、TCP/IP三层体系结构、五层协议体系结构 楼主自己快记方法:巫术、网运会、彪鹰(物、数、网、运、会、表、应)
那么从上往下介绍: **
**
应用层的作用就是通过不同进程之间的交互实现特地的网络应用,因为不同的进程之间交互的规则协议是不同的,如域名系统DNS万维网的http协议、支持邮件的SMTP,他们之间交互的信息单元就是报文。
万维网DNS:(Domain Name System)*,他是能够将域名和ip地址相互映射的分布式系统、让我们不必去记住一连串的ip地址,例如:一个公司的Web网址就相当于他的门户,而域名就相当于它的门牌号,一般域名都会用他们公司的缩写,例如微软:www.ibm.com 百度:www.baidu.com
*HTTP协议:超文本传输协议,是最为广泛的一种网络协议,所有的www(万维网)都要遵守这个规则,创建之初就是用于发布和接收html页面的方法。**负责向两台主机进程之间的沟通,提供通用的数据传输服务。传输的数据就是应用层中的数据报文,通用的是指并不指定那个应用进程能够使用运输层传输报文。因为一个主机可以同时运行多个线程,那么运输层就可以被复用和分用,复用就是多个应用层进程可以使用同一个运输层传递报文,分用就是运输层将收到的信息分发给应用层进程的过程。
运输层主要使用一下两种传输协议:
TCP:传输控制协议(Transmission Control Protocol)面向连接的,是传输安全
UDP:用户数据协议协议(User Datagram Protocol)面向无连接的,是传输不安全的 **
**
计算机网络中进⾏通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。⽹络层的任务就是选择合适的网见路由和交换结点, 确保数据及时传送。 在发送数据时网络层会把运输层的报文段或用户数据报段封装成分组和包进行传输、在TCP/IP网络结构中、网络层使用IP协议,因此分组叫IP数据报,简称数据报。 这⾥强调指出,⽹络层中的“⽹络”⼆字已经不是我们通常谈到的具体⽹络,⽽是指计算机⽹络体系结构模型中第三层的名称.互联⽹是由⼤量的异构(heterogeneous)⽹络通过路由器(router)相互连接起来的。互联⽹使⽤的⽹络层协议是⽆连接的⽹际协议(Intert Protocol)和许多路由选择协议,因此互联⽹的⽹络层也叫做⽹际层或IP层。
两台主机之间的交互数据时总是在一段一段的链路上传输的,所以这时就需要我们的链路层协议。在两个相邻节点之间传输数据时,数据链路层将网络层交下来的ip数据报封装成帧。在相邻节点链路上传输帧,帧中包含必要控制信息:同步信息、控制信息、差错控制信息。(丢错、改错) 物理层:
物理层上传输的数据单元是比特,物理层作用是实现相邻计算机节点之间的比特流的透明传输,尽可能屏蔽掉具体传输介质和物理设备的差异,使上层的数据链路层不必考虑具体的传输介质是什么,所谓透明传输比特流,就是比特流不发生改变(中间商不拿差价的意思)。
以下是三次握手大概资源交换流程
1、第一次握手:客户端将有SYN标记的数据包发给服务器端
2、第二次握手:服务器端返回客户端有SYN/ACK标记的数据包
3、第三次握手:客户端返还服务器端有ACK标记的数据包 为什么要执行三次握手呢?
最主要的还是为了能够确保资源通信的双方传送和接收安全。
第一次握手:Client(客户端)什么都不能确认,Server(服务器端)确认对方发送正常、自己接收正常。
第二次握手:Client确认对方发送正常、接收正常、自己接收正常、发送正常, Server确认自己接收正常、对方发送正常
第三次握手:Client确认对方发送正常、接收正常、自己接收正常、发送正常,Server确认对方发送正常、接收正常、自己接收正常、发送正常。
所以三次握手就是确认对方、自己接受与发送是否正常。
为什么要传回SYN?
因为传回SYN是为了让发送者确认我接收到的信息是你发送的没错。 为什么传了SYN还要传ACK?
之所以传了SYN还要传ACK呢,是因为SYN是为了向客户端确认服务器收到的信息是本客户端的,ACK呢是为了让客户端在确认收到服务器端信息是确认是服务器发的没错。
如果要断开其中的一个连接那么就需要进行四次挥手:
1、客户端-发送⼀个 FIN,⽤来关闭客户端到服务器的数据传送 2、服务器-收到这个 FIN,它发回⼀ 个 ACK,确认序号为收到的序号加1 。和 SYN ⼀样,⼀个 FIN 将占⽤⼀个序号 3、服务器-关闭与客户端的连接,发送⼀个FIN给客户端 4、客户端-发回 ACK 报⽂确认,并将确认序号设置为收到序号加1
为什么要进行四次挥手? 为什么要四次挥⼿任何⼀⽅都可以在数据传送结束后发出连接释放的通知,待对⽅确认后进⼊半关闭状态。当另⼀⽅也没 有数据再发送的时候,则发出连接释放通知,对⽅确认后就完全关闭了TCP连接。
举个例⼦:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可 能还会有要说的话,A 不能要求 B 跟着⾃⼰的节奏结束通话,于是 B 可能⼜巴拉巴拉说了⼀通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。
标志位:
**紧急URG,当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据; 确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1; 推送PSH,当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1; 复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;当RS置为1时还可以用来拒绝一个非法的报文段或拒绝打开一个TCP连接 同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1; 终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;**1、首先第一次握手:客户端先发送TCP请求,设置同步标识符SYN=1,设置序号为x
2、第二次握手:服务器确定TCP连接,所以此确定要有效就得设置ACK=1,告诉客户端我收到请求了,序号为y,确认号为x+1,同步标识设为SYN=1,。
3、第三次握手:客户端确认服务器已经收到连接请求,并且返回给服务器确定信息,ACK确认标志位为1,序号为x+1,确认号
为y+1,。
1、首先客户端向服务器端发送断开连接TCP请求,设结束标志位FIN=1,序号为u,确认号为v。
2、服务器端收到请求后响应确认请求,设置确认标志位为ACK=1,序号为v,确认号为u+1;
(在服务器端还没执行连接释放或者双方都没确认时是可以传输数据的,这时ACK你会发现ACK都为1,因为这时还是在连接状态)
3、这时服务器发送TCP释放请求给客户端
4、客户端确认连接释放,这时就结束了整个TCP连接。
**
** UDP 在传送数据之前不需要先建⽴连接,远地主机在收到 UDP 报⽂后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是⼀种最有效的⼯作⽅式(⼀般⽤于即时通信),⽐ 如: QQ 语⾳、 QQ 视频 、直播等等
TCP 提供⾯向连接的服务。在传送数据之前必须先建⽴连接,数据传送结束后要释放连接。 TCP 不提 供⼴播或多播服务。由于 TCP 要提供可靠的,⾯向连接的传输服务(TCP的可靠体现在TCP在传递数据 之前,会有三次握⼿来建⽴连接,⽽且在数据传递时,有确认、窗⼝、重传、拥塞控制机制,在数据传 完后,还会断开连接⽤来节约系统资源),这⼀难以避免增加了许多开销,如确认,流量控制,计时器 以及连接管理等。这不仅使协议数据单元的⾸部增⼤很多,还要占⽤许多处理机资源。TCP ⼀般⽤于⽂ 件传输、发送和接收邮件、远程登录等场景。
1、应用数据被tpc分割成是最好传输的数据格式。
2、TCP 给发送的每⼀个包进⾏编号,接收⽅对数据包进⾏排序,把有序数据传送给应⽤层。 3. 校验和: TCP 将保持它⾸部和数据的检验和。这是⼀个端到端的检验和,⽬的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报⽂段和不确认收到此报⽂段。
TCP 的接收端会丢弃重复的数据。
流量控制: TCP 连接的每⼀⽅都有固定⼤⼩的缓冲空间,TCP的接收端只允许发送端发送接收端 缓冲区能接纳的数据。当接收⽅来不及处理发送⽅的数据,能提示发送⽅降低发送的速率,防⽌包丢失。TCP 使⽤的流量控制协议是可变⼤⼩的滑动窗⼝协议。 (TCP 利⽤滑动窗⼝实现流量 控制)
拥塞控制: 当⽹络拥塞时,减少数据的发送。
ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完⼀个分组就停⽌发送,等待对⽅确认。在收到确认后再发下⼀个分组。
超时重传: 当 TCP 发出⼀个段后,它启动⼀个定时器,等待⽬的端确认收到这个报⽂段。如果不能及时收到⼀个确认,将重发这个报文段。
ARQ(AutoAtomic Repeat-reQuest):是OSI模型中的数据链路层和运输层之间的纠错协议之一。他通过使用确认和超时两个机制在不可靠的环境下实现可靠的信息传输。如果发送方在发送一段时间之内没有收到确认帧,通常情况下他会重新发送。ARQ包括停⽌等待ARQ协议和连续ARQ协议。
停止等待AQS协议:
*基本原理:就是发送方在发送一段时间内,如果没有收到接收方就停止发送下一分组,如果一段时间后没有收到接收确认就是说明没有收到就重复发送。如果发送方回复确认后(ACK)继续发送下一分组。
*如果接收方收到重复分组,就删掉,当然也要恢复确认。
优点:
1、简单
缺点:信道要利用率低,等待时间长。
可能发生的情况分析:
⽆差错情况: 发送⽅发送分组,接收⽅在规定时间内收到,并且回复确认.发送⽅再次发送。
出现差错情况(超时重传): 停⽌等待协议中超时重传是指只要超过⼀段时间仍然没有收到确认,就重传前⾯发送过的分组(认为刚 才发送过的分组丢了)。因此每发送完⼀个分组需要设置⼀个超时计时器,其重传时间应⽐数据在分组传输的平均往返时间更⻓⼀些。这种⾃动重传⽅式常称为 ⾃动重传请求 ARQ 。另外在停⽌等待协议 中若收到重复分组,就丢弃该分组,但同时还要发送确认。
确认丢失和确认迟到 确认丢失 :确认消息在传输过程丢失。当A发送M1消息,B收到后,B向A发送了⼀个M1确认消 息,但却在传输过程中丢失。⽽A并不知道,在超时计时过后,A重传M1消息,B再次收到该消息 后采取以下两点措施:1. 丢弃这个重复的M1消息,不向上层交付。 2. 向A发送确认消息。(不 会认为已经发送过了,就不再发送。A能重传,就证明B的确认消息丢失)。
确认迟到 :确认消息在传输过程中迟到。A发送M1消息,B收到并发送确认。在超时时间内没有 收到确认消息,A重传M1消息,B仍然收到并继续发送确认消息(B收到了2份M1)。此时A收到了B 第⼆次发送的确认消息。接着发送其他数据。过了⼀会,A收到了B第⼀次发送的对M1的确认消息 A也收到了2份确认消息)。处理如下:1. A收到重复的确认后,直接丢弃。2. B收到重复的M1 后,也直接丢弃重复的M1
连续 ARQ 协议
发送维 持⼀个发送窗⼝,凡位于发送窗⼝内的分组可连续发送出去,⽽不需要等待对⽅确认。接收⽅⼀般采⽤ 累积确认,对按序到达的最后⼀个分组发送确认,表明到这个分组位置的所有分组都已经正确收到了。
优点: 提⾼信道利⽤率,容易实现、即使后面确认丢失也不必重发
缺点: 不能向发送⽅反映出接收⽅已经正确收到的所有分组的信息。 ⽐如:发送⽅发送了 5条 消 息,中间第三条丢失(3号),这时接收⽅只能对前两个发送确认。发送⽅⽆法知道后三个分组的下 落,⽽只好把后三个全部重传⼀次。这也叫 Go-Back-N(回退N),表示需要退回来重传已经发送过的 N 个消息。
滑动窗口和流量控制:
滑动窗口和流量控制:流量控制是为了控制发送方的速率,从而接收方能够方便跟的上接收,滑动窗口的意思是接收方的窗口字段可以控制发送方的窗口大小,从而控制分组的发送速率,如果窗口字段设置为0,那么发送方就没法发送。
拥塞控制
当对网络中某一资源的需求大于了它所能提供的可用部分,这样会造成网络性能的变差,这就是网络拥塞的概念。拥塞控制就是防止过多的数据注入到网络中去,这样网络使网络中的路由器或链路不至于过载。拥塞控制所要做的都有⼀个前提,就是⽹络能够承受现有的⽹络负荷。拥塞控制是⼀个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低⽹络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
当然流量控制时有一个滑动窗口,那么拥塞控制时肯定会有一个拥塞控制的窗口—拥塞窗口,而且拥塞窗口要是比接受端接收窗口更小的一个窗口,这样就防止发送端请求的资源量小于我可提供存放这个资源量。 TCP拥塞控制一般采用以下算法进行:慢开始、拥塞避免、快重传、快恢复。。在⽹络层也可以使路由器采⽤适当的分组丢弃策略(如主动队列管理 AQM),以减少⽹络拥塞的发⽣。
**慢开始:**在开始发送数据时先不要着急马上将大量的数据注入网络中,首先试探性勘测先用较小的发送窗口(拥塞窗口)然后再慢慢增大,cwnd(描述拥塞窗口的大小)初始值等于1,每经过⼀个传播轮次,cwnd加倍。 **拥塞避免:**拥塞避免算法的思路是让拥塞窗⼝cwnd缓慢增⼤,即每经过⼀个往返时间RTT就把发送放的cwnd加1. **快重传与快恢复:**在 TCP/IP 中,快速重传和恢复(fast retransmit and recovery,FRR)是⼀种拥塞控制算法,它能快速恢复丢失的数据包。没有 FRR,如果数据包丢失了,TCP 将会使⽤定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了 FRR,如果接收机接收到⼀个不按顺序的数据段,它会⽴即给发送机发送⼀个重复确认。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并⽴即重传这些丢失的数据段。有了FRR,就不会因为重传时要求的暂停被耽误。 当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地⼯作。当有多个数据信息包在某⼀段很短的时间内丢失时,它则不能很有效地⼯作。
基本步骤: 1、DNS域名解析 2、TCP连接 3、客户端发送HTTP请求 4、服务器端处理请求,返回HTTP报文 5、客户端接收响应并解析,渲染显示页面 6、连接结束
图片解析:
具体各层发送协议:
1、DNS域名解析:因为DNS中域名和IP号是绑定在一起的,所以输入URL后就会解析获取对应IP(DNS协议) 2、TCP连接:TCP协议 3、获取到了IP后:数据要传输所以在网络层中传输时就使用到了IP协议 4、IP数据包在路由器之间传输,这时需要OPSF传输协议 5、在路由器和服务器之间传输时需要ARP传输协议,将ip地址转化为MAC地址,交给服务器解析 6、建立完TCP连接后使用HTTP洗衣访问页面
状态码:
因为HTTP是无状态的,不对请求和响应间的通信状态做记录,这时就必须要有一个东西用于记录我们的用户状态。 原来服务器会为每一个用户创建特定的Session,用来记录用户的状态。当然Session的时间一般也是会设置的,一段时间后Session会被销毁。 在服务端保存 Session 的⽅法很多,最常⽤的就是内存和数据库(⽐如是使⽤内存数据库redis保存)。 既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?⼤部分情况下,我们都是通过在 Cookie 中附加⼀个 Session ID 来⽅式来跟踪。
最常用的就是利用重写URL将我们的Session ID写到URL后面去。
Cookie 和 Session都是⽤来跟踪浏览器⽤户身份的会话⽅式,但是两者的应⽤场景不太⼀样。
Cookie ⼀般⽤来保存⽤户信息 ⽐如①我们在 Cookie 中保存已经登录过得⽤户信息,下次访问⽹站的时候⻚⾯可以⾃动帮你登录的⼀些基本信息给填了;②⼀般的⽹站都会有保持登录也就是说下次你再访问⽹站的时候就不需要重新登录了,这是因为⽤户登录的时候我们可以存放了⼀个 Token 在 Cookie中,下次登录的时候只需要根据 Token 值来查找⽤户即可(为了安全考虑,重新登录⼀般要将 Token重写);③登录⼀次⽹站后访问⽹站其他⻚⾯不需要重新登录。
Session 的主要作⽤就是通过服务端记录⽤户的状态。 典型的场景是购物⻋,当你要添加商品到购物⻋的时候,系统不知道是哪个⽤户操作的,因为 HTTP 协议是⽆状态的。服务端给特定的⽤户创建特定的 Session 之后就可以标识这个⽤户并且跟踪这个⽤户了。Cookie 数据保存在客户端。
3.1.10 HTTP⻓连接,短连接 在HTTP/1.0中默认使⽤短连接。也就是说,客户端和服务器每进⾏⼀次HTTP操作,就建⽴⼀次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web⻚中包含有其他的Web资源(如JavaScript⽂件、图像⽂件、CSS⽂件等),每遇到这样⼀个Web资源,浏览器就会重新建⽴⼀个HTTP会话。
⽽从HTTP/1.1起,默认使⽤⻓连接,⽤以保持连接特性。使⽤⻓连接的HTTP协议,会在响应头加⼊这⾏代码: Connection: Keep-Active 在使⽤⻓连接的情况下,当⼀个⽹⻚打开完成后,客户端和服务器之间⽤于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使⽤这⼀条已经建⽴的连接。Keep-Alive不会永久保持连接,它有⼀个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现⻓连接需要客户端和服务端都⽀持⻓连接。HTTP协议的⻓连接和短连接,实质上是TCP协议的⻓连接和短连接。
HTTP/1.0默认是使用短连接,而HTTP/1.1默认使用的是长连接。因为每次请求都三次握手、断开连接就四次挥手消耗太大。所以后面HTTP/1.1为了节省资源也会默认打开一个长连接,HTTP/1.1有两种请求和响应的规则:**流水线方式、非流水线方式。****流水线方式:**客户端在还没有收到http报文前就可以发送新的请求给服务器。非流水线方式:就是没有收到HTTP报文前不能发送新的请求给服务器。
**错误状态响应码:**在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发⽣冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
**缓存处理 😗*在HTTP1.0中主要使⽤header⾥的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引⼊了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match,If-None-Match等更多可供选择的缓存头来控制缓存策略。
带宽优化及网络连接的使用:HTTP/1.0有点浪费带宽的意思,就是一般客户端只需要带·宽的某个头部,而服务器将整个部分都发送过去,而且也不支持断点续传的功能。所以在HTTP/1.1后引入了range在头部、客户端需要多少就给多少,然后就会,即返回码是206(Partial Content),这样就⽅便了开发者⾃由的选择以便于充分利⽤带宽和连接。
URI:统一资源标识符,可以唯一标识一个资源 URL:统一资源定位符,可以标识一个资源,它是一种具体的URI,可以指定资源的路径,确定上哪去找这个资源。
URI的作⽤像身份证号⼀样,URL的作⽤更像家庭住址⼀样。URL是⼀种具体的URI,它不仅唯⼀标识资 源,⽽且还提供了定位该资源的信息。
HTTP的URL是http://开头端口号是80,而HTTPS的URL是https://开头,端口号是443 安全性和资源消耗:HTTP协议是运行在TCP之上传输的,所有报文都是未加密,可见的。客户端和服务器端都不知道来自于谁。而HTTPS协议是基于SSL/TLS传输的,而SSL/TLS是在TCP上运行的,传输的报文都是通过加密的,加密采⽤对称加密,但对称加密的密钥⽤服务器⽅的证书进⾏了⾮对称加密。所以说,HTTP 安全性没有 HTTPS⾼,但是 HTTPS ⽐HTTP耗费更多服务器资源。 **~对称加密:**密钥只有一个,加密和解密都用同一密码,而且加密数速度快,典型的加密算法有DES、AES等 **~非对称加密:**密钥成对出现(且根据公钥无法推出私钥,根据私钥无法推出公钥),加密解密使用不同的密钥(即公钥加密使用私钥解密,私钥加密使用公钥解密),相对于对称加密速率相对较慢,典型的非对称加密算法RAS,DSA。