本文主要讲的是传输层的两大重要协议TCP和UDP,虽然在Android开发中,并不须要了解到这么底层,但有理论的支撑,写代码老是很自信的啦。理论指导着实践,实践是理论检验的惟一标准。站在巨人的肩膀窥伺网络世界。git
用户数据报协议UDP只在IP的数据报服务至上增长了复用和分用的功能以及差错检测的功能。只有面向无链接的报文,不可靠传输的特色。UDP对应用层交下来的数据只添加首部,并进行特别的处理,就交给网络层;对网络层传递上来的用户数据报拆封首部后,原封不动的交给应用层。github
用户数据报UDP分为两个字段:数据字段和首部字段,从图来分析用户数据报UDP的首部格式。 算法
在传输的过程当中,若是接收方UDP发现收到的报文中的目的端口不存在,会直接丢弃,而后由网际控制报文协议ICMP给发送方发送“端口不可达”差错报文。缓存
计算校验和时,须要在UDP以前增长12个字节的伪首部。这种首部并非用户数据报的真正首部。伪首部并不在网络中传输,只是在计算检验和,临时添加在UDP用户数据报前,获得一个临时的用户数据报。网络
UDP的校验和是把首部和数据部分一块儿校验,发送方计算校验和的通常步骤:性能
接收方收到用户数据报后,连同伪首部一块儿,按二进制反码求这些16位字的和,无差错结果是应全为1.不然出错,直接丢弃该报文。线程
TCP协议做为传输层主要协议之一,具备面向链接,端到端,可靠的全双工通讯,面向字节流的数据传输协议。3d
虽然TCP面向字节流,但TCP传输的数据单元倒是报文段。TCP报文段分为TCP首部和数据部分,TCP报文段首部的前20个字节是固定的,后面有4*n字节根据须要动态添加的选项,最大长度为40字节。 指针
三次握手图例以下,与文字解释配合使用效果更佳。code
第二次:服务端接收到报文后,发回确认报文,其中ACK=1,ack=x+1,由于须要客户端确认,因此报文中也有SYN=1,seq=y的信息。发送完后进入SYN_RCVD状态。
第三次:客户端接收到报文后,发送确认报文,其中ACK=1,ack=y+1。发送完客户端进入ESTABLISHED
状态,服务端接收到报文后,进入ESTABLISHED
状态。到此,链接创建完成。
三次握手缘由
避免资源被浪费掉。若是在第二步握手时,因为网络延迟致使确认包不能及时到达客户端,那么客户端会认为第一次握手失败,再次发送链接请求,服务端收到后再次发送确认包。在这种状况下,服务端已经建立了两次链接,等待两个客户端发送数据,而实际却只有一个客户端发送数据。
四次挥手指客户端和服务端各发送一次请求终止链接的报文,同时双方响应彼此的请求。 四次挥手图例以下,请配置文字解释使用哦。
FIN_WAIT_1
状态。
第二次挥手:服务端收到请求包后,发回ACK=1,ack=x+1的确认包,表示确认断开链接。服务端进入CLOSE_WAIT
状态。客户端收到该包后,进入FIN_WAIT_2
状态。此时客户端到服务端的数据链接已断开。
第三次挥手:服务端发送FIN=1,seq=y的包给客户端,表示本身没有数据要给客户端了。发送完后进入LAST_ACK
状态,等待客户端的确认包。
第四次挥手:客户端收到请求包后,发送ACK=1,ack=y+1的确认包给服务端,并进入TIME_WAIT
状态,有可能要重传确认包。服务端收到确认包后,进入CLOSED
状态,服务端到客户端的链接已断开。客户端等到一段时间后也会进入CLOSED
状态。
四次挥手缘由 因为TCP的链接是全双工,双方均可以主动传输数据,一方的断开须要告知对方,让对方能够相关操做,负责任的表现。
使用TCP协议有:FTP(文件传输协议)、Telnet(远程登陆协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等
TCP滑动窗口协议主要为了解决在网络传输数据的过程当中,发送方和接收方传输数据速率不一致的问题,从而保证数据传输的可靠性,达到流量控制的效果。 发送方中的数据分为三种:
接收方数据分为三种:
在发送方的滑动窗口中,可分为发送窗口和可用窗口。发送窗口中的数据已发送接收方,但未接到接收方的确认;可用窗口则表示发送方还能够发送多少数据。发送方的窗口大小会受到接收方窗口的改变而改变。
接收方数据被上层读取后,又能够接收序号为501-600共100个字节,因此通知A,接收窗口大小为100,序号为501开头....在上图的整个过程当中,A共收到B三次流量控制。
应用层把数据传递给传输层的TCP的发送缓存后,TCP经过不一样的机制来控制报文段的发送时机。 主要有下面三种机制:
不一样的发送机制都会带来必定的效率问题,例如用户发送一个字符,加上20字节首部,获得21字节长的TCP报文段,再加上21字节的IP首部,就变成41字节长的IP数据报。发送一个字节,线路上就须要发送41字节长的IP数据报,若等待接收方确认,线程就又多了40字节长的数据报。因此在线程带宽不富裕时,这种传输效率很是不高。所以应当推迟发回确认报文,并尽可能使用捎带确认的方法。
Negle算法主要为了解决TCP的传输效率问题。Negle算法规定:若要把发送的数据逐个字节缓存起来,则发送方须要把第一个字节发送出去,而后缓存后面的字节,在收到接收方第一个字节的确认,再将现有缓存中全部字节组成一个报文段发送出去,继续缓存后续数据。只有在收到前一个报文的确认以后发送后面的数据。这是为了减小所用带宽。当发送数据到达TCP发送窗口的一半或已达到报文段的最大长度也会当即发送报文段,而不是等待接收方确认。这是为了提升网络吞吐量。
TCP接收方的缓存已满,若上层一次从缓存中读取一个字节,这样接收方就能够继续接纳一个字节的窗口,而后向发送方发送确认,把窗口设为1个字节(上文所讲,IP数据报为41字节长)。若是这样持续下去,那么网络效率很是低。
因此有效的解决方法,就是让接收方等待必定时间,让缓存空间可以接纳一个最长的报文段,或者等待接收缓存已有一半的空闲空间,再发出确认报文和通知当前窗口大小。
什么是拥塞呢,在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就会变坏了,这种状况就叫拥塞。网络资源常指网络链路容量(带宽)、交换结点中的缓存和交换处理机。
当出现拥塞,条件容许通常都是经过添加网络资源,例如带宽换成更大的,但这治标不治本,并且不必定老是有用。网络拥塞每每是有许多因素引发的,所以就须要拥塞控制了。
拥塞控制指防止过多的的数据注入到网络中,这样可使网络中的路由器或链路不过载。拥塞机制是一个全局性的过程,涉及到全部主机、全部路由器,以及与下降网络传输性能有光的全部因素。
而滑动窗口协议的流量控制,是指点到点的通讯量控制,是端到端的问题。
TCP进行拥塞控制的算法有四种:慢开始、拥塞避免、快重传、快恢复。
拥塞控制是基于拥塞窗口的,发送方维持一个拥塞窗口 cwnd的状态变量。窗口大小取决网络的拥塞程度,而且动态变化,发送方会让本身的发送窗口等于拥塞窗口。判断网络拥塞的依据就是发送方接收接收方的确认报文是否超时。
慢开始指主机由小到大逐渐增大发送窗口,即增大拥塞窗口的数值。初始拥塞窗口cwnd设置为不超过2到4个最大报文段SMSS的数值,具体规定:
从上面的规定限制了初始拥塞窗口的大小。
慢开始在每收到一个对新的报文段的确认后,cwnd就能够增长最多一个SMSS的数值。
拥塞避免算法就是让cwnd缓慢增大,每个轮次把拥cwnd增长1,而不是像慢开始算法那样翻倍增长。须要注意的是,拥塞避免算法只是让网络不那么快出现拥塞,而不是避免拥塞出现。
上文已经说到,判断网络是否拥塞以报文是否超时为准,当网络出现拥塞时,会把ssthresh设为原有的一半,而后开始慢开始算法。以下图所示:
快重传算法是让发送方今早知道发生了个别报文段的丢失。快重传算法要求接收方不要等待本身发送数据时才进行捎带确认,而是当即发送确认。也就是说,但出现丢包状况,接收方在接收新数据时会重复发送对丢失包的前一个报文段的确认号。发送方接收到三次确认号后,就判断该丢失报文段确实丢失,会当即进行重传(快重传)。
在上文,知道只是报文段丢失,而不是网络出现拥塞后,发送方会调整ssthresh为原来的一半,而后继续进行拥塞避免算法,这个过程就叫快开恢复算法。
可见,TCP拥塞控制四个算法是相辅相成,少了谁都不行,共同维护这拥塞控制机制。下面是整体的流程图。
点个赞收藏吧