总结回顾html
这篇文章你会了解到什么git
做用:它是与其余计算机进行通讯的应用,它是对应应用程序的通讯服务的。各类应用软件,包括web应用。github
协议:DNS、FTP、HTTP、SMTP、TELNET、IRC、WHOISweb
做用:这一层的主要做用是定义数据格式和加密。面试
做用:控制应用程序的会话能力,它定义了一段会话的开始、控制和结束,包括对多个双向消息的控制和管理,以便在只完成一部分消息时能够通知应用。算法
PS:其实在应用层、表示层、会话层这三层中,协议是能够共用的 数组
做用:对差错恢复协议和无差错恢复协议的选择,对同一主机上不一样数据流的输入进行复用,对数据包进行从新排序。是最关键的一层,是惟一负责总体的数据传输和数据控制的。对上三层提供可靠的传输服务,对网络层提供可靠的目的地信息。在这一层数据的单位被称为数据段。缓存
协议:TCP、UDP等安全
做用:主要负责寻找地址和路由选择,网络层还能够实现阻塞控制、网际互联等。cookie
协议:IP、IPX、RIP、OSPF等
做用:负责物理层面上的互联的、节点间的通讯传输;该层的做用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)
协议:ARP、RARP、SDLC、HDLC、PPP、STP、帧中继等
做用:负责0、1 比特流(0/1序列)与电压的高低、逛的闪灭之间的转换 规定了激活、维持、关闭通讯端点之间的机械特性、电气特性、功能特性以及过程特性;该层为上层协议提供了一个传输数据的物理媒体。在这一层,数据的单位称为比特(bit)。
典型规范:EIA/TIA RS-23二、EIA/TIA RS-44九、V.3五、RJ-4五、fddi令牌环网等
OSI:
TCP/IP:
计算机与网络设备要互相通讯,双方须要基于相同的方法。好比如何创建通讯目标,如何创建通讯链接,由那一边先发起通讯,使用何种语言进行通讯,什么时候断开,这些都须要事先确认好。不一样设备、不一样操做系统之间也须要确认规则,咱们称这些规则为协议。
TCP/IP是互联网相关协议的统称,包含:TCP,DUP,IP,FTP,HTTP,SMTP等等协议。
TCP/IP 模型是互联网的基础,它是一系列网络协议的总称。这些协议能够划分为四层,分别为链路层、网络层、传输层和应用层。
在网络体系结构中网络通讯的创建必须是在通讯双方的对等层进行,不能交错。 在整个数据传输过程当中,数据在发送端时通过各层时都要附加上相应层的协议头和协议尾(仅数据链路层须要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通讯协议。接下去介绍 TCP/IP 中有两个具备表明性的传输层协议----TCP 和 UDP。
UDP全称是用户数据协议,UDP是处于传输层的协议。和TCP同样是处理数据包的。UDP是面向无链接的。UDP不提供数据分组和组装,也不对数据进行重排,不保证数据是否安全到达。
UDP是一种面向无链接的协议,在发送数据以前,它不须要想TCP同样须要三次握手创建链接,想发送数据就能够发送,它只是数据的搬用工,不会对数据进行任何的拆分和组装。
基于UDP是面试无链接的,不须要创建链接,想何时发送数据均可以发,因此,UDP是不可靠的。而且接受到什么数据就传递什么数据,并不会进行数据的备份。发送数据方并不关心数据是够丢失,也不关心接收方是够正确接收数据。 而后网络时好时坏,可是UDP协议没有网络阻塞的功能,若是数据开始发送,就会以一种恒定的速度开始发送数据。即便在网络很差的状况下,也不会进行速度的调整,这样会致使,在网络状况通常时,发生数据丢包。
UDP以恒定的速度发送数据,在网络状况不佳的状况下,是不可靠的,可是正是因为这样的不可靠性,致使UDP没有TCP那么复杂,不须要去保证数据的准确到达,也不须要重发,更不行考虑数据丢包的状况。
UDP头部包含:
因此,DUP的头部开销小,只有八个字节,相比TCP的二十几个字节在数据传输时,是很是高效的。
UDP不仅支持一对一的传输方式,还支持一对多、多对多、多对一的传输方式。换句话说,UDP提供了单播、多播、广播的传输方式。
在数据发送时,UDP只是对应用层数据进行UDP头部表示就传递给IP网络层,而且不会对数据进行分组、拆分和封装,保留报文的边界,那么须要应用程序选择合适的报文大小。
使用场景:直播,游戏,等大几率会使用UDP,若是使用TCP,可能会出现极差的用户体验。TCP保证数据的准确和正确,若是网络出现波动,数据传输慢,等到数据传到过来时,可能已经发生了不少事情,用户的画面不是最新,已然是不能知足用户诉求。
当计算机进行通讯时,两台计算机不少时候须要保证数据的可靠安全正确。例如,当你查看邮寄或者访问一个网页时,若是你不但愿你看见的网页或者邮寄是完整的,没有丢失内容,那么这里须要使用到TCP。
TCP全称是传输控制协议,是一种面向有链接、安全可靠的、基础字节流的传输控制协议。
在发送数据以前,双方须要创建链接,才能进行数据的正常发送。
每条TCP传输只能在两个端点,只能进行点对点的传输,不支持多播和广播。
TCP不像UDP那样一个报文一个报文独立传输,而是在不保存报文边界的状况下以字节流的形式传输。
TCP为了保证传输的可靠性给每个包一个序号,同时也保证了传输到接收方的包是按序排列。接收方对于已经接受的包会回传一个相应的确认(ACK),若是发送方在确认的往返时延(RTT)没有收到确认,就会从新发送。
当网络出现阻塞的时候,TCP会减小发送数量和发送速率。
TCP容许通讯的双方应用程序在任什么时候候发送数据,由于TCP在两端都设有缓存,来存放临时通讯数据。TCP能够立刻发送数据段,也能够缓存等待一段时候在发数据段,以便一次发送更多的数据(最大的数据段取决于MSS)。
起初客户端和服务端是都出关闭的状态,在通讯开始前,双方会创建TCB,客户端在创建以后进行准备发送阶段,服务端处于LISTEN状态。
客服端发送请求链接报文段,其中包括自身的数据通讯初始码。在请求发送以后,客户端进去了SYN-SENT状态。
服务端接受到请求链接报文,若是赞成链接,这服务端回复一个报文段,其中也会包含一个自身的数据通讯数据码。在发送后,便进入了SYN-RECEIVED状态。
客户端接受到服务端的报文段。还要向服务端发送一个确认报文。客户端在发送完成以后就进行了ESTABLISHED状态,服务端在接受到这个请求后也进行ESTABLISHED状态。此时客户端服务端创建链接完成。
PS:第三次握手中能够包含数据,经过快速打开(TFO)技术就能够实现这一功能。其实只要涉及到握手的协议,均可以使用相似 TFO 的方式,客户端和服务端存储相同的 cookie,下次握手时发出 cookie 达到减小 RTT 的目的。
PS:两次握手就能够完成,为撒须要三次了? 由于这是为了防止出现失效的链接请求报文段被服务端接收的状况,从而产生错误。 能够想象以下场景。客户端发送了一个链接请求 A,可是由于网络缘由形成了超时,这时 TCP 会启动超时重传的机制再次发送一个链接请求 B。此时请求顺利到达服务端,服务端应答完就创建了请求,而后接收数据后释放了链接。 假设这时候链接请求 A 在两端关闭后终于抵达了服务端,那么此时服务端会认为客户端又须要创建 TCP 链接,从而应答了该请求并进入 ESTABLISHED 状态。可是客户端实际上是 CLOSED 的状态,那么就会致使服务端一直等待,形成资源的浪费。
PS:在创建链接中,任意一端掉线,TCP 都会重发 SYN 包,通常会重试五次,在创建链接中可能会遇到 SYN Flood 攻击。遇到这种状况你能够选择调低重试次数或者干脆在不能处理的状况下拒绝请求。
如客户端认为数据发送完成,须要向服务端发送释放链接的请求。客户端进入FIN_WAIT_1状态。
服务端接收到客户端的链接释放请求,会告诉应用层要释放TCP链接。而后发送ACK到客户端,而后进入CLOSE_WAIT状态。此时代表客户端到服务端的链接已经释放,不会接受来自客户端的数据了,可是因为TCP是全双工。因此此时服务端还能够向客户端发送数据。
服务端若是在此时数据尚未发送完成,会继续发送,在数据发送完毕以后。服务端会向客户端发送链接释放的请求。而后服务端进入LAST_ACK状态。
客户端在接受到服务端的释放请求。会向服务端在发送一个确认请求。此时客户端进入TIME_WAIT状态 该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 服务端的重发请求的话,就进入 CLOSED 状态。当 客户端收到确认应答后,也便进入 CLOSED 状态。
PS:为何 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态? 为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进入 CLOSED 状态,若是确认应答由于网络问题一直没有到达,那么会形成 B 不能正常关闭。
ARQ协议就是超时重传机制。经过确认和超时机制保证数据的正确到达,是OSI模型中传输层和数据链路层的错误纠正协议之一,在不可靠的服务基础上实现可靠的信息传输。ARQ协议包含中止等待ARQ协议和连续ARQ协议,拥有错误检测,正面确认,超时重传和负面确认及重传等机制。
TCP是全双工协议,就是在创建链接以后,双方就是发送方也是接收方。在只考虑只是一方发送一方接收的状况下。咱们假设发送方为A,接收方为B。
A发送报文分组M1,发送完毕就暂停发送,等待B的确认。B收到M1,就向A发送确认。A收到确认以后就在发送下一个分组M2。
若是A发送过程当中出现差错或者B在接收M1是检查到出了差错(这里A在发送以前会保存分组的副本,再只有在收到确认以后才会清除副本),B在接收M1时检测到差错就丢弃M1,其余什么都不作。出现差错的状况,A只要超过一段时间没有收到确认,就职务出现差错,就会从新发送刚刚的分组,也就是超时重传。
超时重传就是在A发送完一个分组以后,就会设置一个超时计时器,若是在超时时间大于这个时间,就会从新发送分组。固然若是在时间内收到确认信息就不会从新发送。通常超时计时器的时间应该是大于一个RTT时间。
若是A向B发送了分组M1,B接收到M1以后,发送确认应答信息,可是因为网络问题,确认信息丢失,那么这个时间,A在超时重传的时间段内,没有收到B 的确认信息。A会重传M1分组。那么B会作两个动做,①B会丢弃到M1分组,不向上层交付 ,由于以前已经收到过M1分组。②向A发送确认信息。
中止等待ARQ协议的优势是简答,但也有很严重的肯定,就是信道利用率过低。 信道利用率U = TD / (TD + RTT + TA)。 其中Td发送时延,RTT是一个往返时间,Ta是接收时延
因为中止等待ARQ协议通道利用率过低,全部须要使用连续ARQ协议来进行改善。这个协议会连续发送一组数据包。而后等待这些数据包的ACK。
连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。当发送方收到第一个分组的确认,就把发送窗口向前移动一个分组的位置。若是原来已经发送了前5个分组,则如今能够发送窗口内的第6个分组。
接收方通常都是采用累积确认的方式。也就是说接收方没必要对收到的分组逐个发送确认。而是在收到几个分组后,对按序到达的最后一个分组发送确认。若是收到了这个分组确认信息,则表示到这个分组为止的全部分组都已经正确接收到了。
累积确认的优势是容易实现,即便确认丢失也没必要重传。但缺点是,不能正确的向发送方反映出接收方已经正确收到的全部分组的信息。好比发送方发送了前5个分组,而中间的第3个分组丢失了,这时候接收方只能对前2个发出确认。而不知道后面3个分组的下落,所以只能把后面的3个分组都重传一次,这种机制叫Go-back-N(回退N),表示须要再退回来重传已发送过的N个分组。
滑动窗口协议在在发送方和接收方之间各自维持一个滑动窗口,发送发是发送窗口,接收方是接收窗口,并且这个窗口是随着时间变化能够向前滑动的。它容许发送方发送多个分组而不需等待确认。TCP的滑动窗口是以字节为单位的。
发送窗口中有四个概念:
滑动窗口是一个很重要的概念,它帮助 TCP 实现了流量控制的功能。接收方经过报文告知发送方还能够发送多少数据,从而保证接收方可以来得及接收数据,防止出现接收方带宽已满,可是发送方还一直发送数据的状况。
网络拥塞现象是指到达通讯网络中某一部分的分组数量过多,使得该部分网络来不及处理,以至引发这部分乃至整个网络性能降低的现象,严重时甚至会致使网络通讯业务陷入停顿,即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机制。
拥塞控制是一种用来调整传输控制协议(TCP)链接上单次发送的分组数量的算法,经过增减单次发送量逐步调整,使之逼近当前网络的承载量。若是单次发送量为1,此协议就退化为停等协议。单次发送量是以字节来作单位的;可是若是假设TCP每次传输都是按照最大报文段(MSS)来发送数据的,那么也能够把数据包个数看成单次发送量的单位,因此有时咱们说单次发送量增长1也就是增长至关于1个最大报文段的字节数。
拥塞控制假设分组的丢失都是由网络繁忙形成的。拥塞控制有三种动做,分别对应到源主机感觉到的状况:
收到一条新确认。代表当前的单次发送量小于网络的承载量。此时能够增长单次发送量。若当前单次发送量小于慢启动阈值(ssthreash),则单次发送量加倍(乘以2),即指数增加;不然单次发送量加1,即线性增加。
收到三条对同一分组的确认,即三条重复的确认。说明网络有一点儿繁忙。此时单次发送量减半,慢启动阈值(ssthreash)约等于单次发送量,进入线性增加阶段。
对某一个分组的确认迟迟未到,即超时。说明网络比上一状况中的更加繁忙。此时慢启动阈值=单次发送量÷2,单次发送量=1,进入慢启动阶段(指数增加阶段)。
慢启动,是传输控制协议(TCP)使用的一种阻塞控制机制。慢启动也叫作指数增加期。 慢启动算法经过观察到新分组进入网络的速率应该与另外一端返回确认的速率相同而进行工做。
慢启动为发送方的TCP增长了另外一个窗口:拥塞窗口(congestion window),记为cwnd。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。算法描述以下:
当与另外一个网络的主机创建TCP链接时,拥塞窗口被初始化为1个报文段(即另外一端通告的报文段大小)。
每收到一个ACK,拥塞窗口就翻倍(cwnd以字节为单位,可是慢启动以报文段大小为单位进行增长)。这是一种指数增加的关系。
发送方取拥塞窗口与通告窗口中的最小值做为发送上限。
慢启动算法是在一个链接上发起数据流的方法,其指数级增加很快就会使网络出现拥塞现象,由于某些点上可能达到了互联网的容量,因而中间路由器开始丢弃分组。拥塞避免算法是一种处理丢失分组的方法。有两种分组丢失的指示:发生超时和接收到重复的确认。发生超时,指源主机在超时定时器溢出时没有收到目的主机对某一分组的ACK;接收到重复确认,指在源主机的超时定时器溢出前,连续收到3个或3个以上收对某一分组的ACK。
当发现超时或接收到3次重复确认时,则表示有丢包事件,此时网络已发生拥塞现象,要进行相应的拥塞控制。算法描述以下:
将慢启动阈值(ssthreash)设置为当前窗口的一半(cwnd 和通告窗口大小的最小值,但最小为2个报文)。
若是是超时引发的拥塞,则拥塞窗口(cwmd)被置为1,进入慢启动过程。若是是重复确认引发的拥塞,则进入快速重传和快速恢复过程。
进入慢启动阶段后,拥塞窗口会指数级增加,若是拥塞窗口大于慢启动阈值(ssthreash),执行拥塞避免算法。执行拥塞避免算法时,因为慢启动阈值(ssthreash)已经存在,拥塞窗口大小再也不翻倍增加,而是线性增长。
拥塞避免算法和慢启动算法是两个目的不一样、独立的算法。可是当拥塞发生时,咱们但愿下降分组进入网络的传输速率,因而能够调用慢启动来做到这一点。在实际中这两个算法一般在一块儿实现。1990年出现的TCPReno版本增长了 “快速重传”算法、”快速恢复”算法,避免了当网络拥塞不够严重时采用”慢启动”算法而形成过大地减少发送窗口尺寸的现象。
目的主机在收到一个失序的报文段时,会当即产生一个ACK(重复的ACK),这个重复的ACK不该该被延迟,目的在于让源主机知道目的主机收到了一个失序的报文段,并告诉源主机本身但愿收到的序号。
因为咱们不知道一个重复的ACK是由一个丢失的报文段引发的,仍是因为仅仅出现了几个报文段的从新排序,所以咱们等待少许重复的ACK到来。假如这只是一些报文段的从新排序,则在从新排序的报文段被处理并产生一个新的ACK以前,只可能产生1到2个重复的ACK。若是一连串收到3个或3个以上的重复ACK,就很是多是一个报文段丢失了,进入快速重传过程,描述以下:
1.将慢启动阈值(ssthreash)设置为当前拥塞窗口(cwnd)的一半,设置拥塞窗口(cwnd)为慢启动阈值(ssthreash)加上3倍的报文段大小。重传丢失的数据报文段,而无需等待超时定时器溢出。
2.每次收到另外一个重复的ACK时,cwnd增长一个报文段大小并发送1个分组(若是新的cwnd容许发送)。收到另外一个重复的ACK,说明网络中传输的一个分组到达了目的主机,网络中可再容纳一个分组,故cwnd增长一个报文段大小并发送一个分组。
丢失的分组经过快速重传过程发送完,并被目的主机接受后,目的主机就再也不发送重复的ACK通知源主机发送丢失的分组了,而是发送确认新数据的ACK通知源主机发送新的分组。这个ACK应该是在进行重传后的一个往返时间内对重传分组的确认,也应该是对丢失的分组和收到的第1个重复的ACK之间的全部中间报文段的确认。此时为了快速的恢复到较高的传输速度,就会进入快速恢复阶段,算法描述以下:
参考