本文整顿了一些TCP/IP协定簇中须要必知必会的十大问题,既是面试高频问题,又是程序员必备根底素养。
TCP/IP十个问题
TCP/IP十个问题
一、TCP/IP模型
TCP/IP协定模型(Transmission Control Protocol/Internet Protocol),蕴含了一系列形成互联网根底的网络协议,是Internet的外围协定。
基于TCP/IP的参考模型将协定分成四个档次,它们别离是链路层、网络层、传输层和应用层。下图示意TCP/IP模型与OSI模型各层的对照关系。
TCP/IP协定族依照档次由上到下,层层包装。最下面的是应用层,这外面有http,ftp,等等咱们相熟的协定。而第二层则是传输层,驰名的TCP和UDP协定就在这个档次。第三层是网络层,IP协定就在这里,它负责对数据加上IP地址和其余的数据以确定传输的指标。第四层是数据链路层,这个档次为待传送的数据退出一个以太网协定头,并进行CRC编码,为最初的数据传输做筹备。
上图分明地示意了TCP/IP协定中每个层的作用,而TCP/IP协定通信的过程其实就对应着数据入栈与出栈的过程。入栈的过程,数据发送方每层一直地封装首部与尾部,增加一些传输的信息,确保能传输到目的地。出栈的过程,数据接管方每层一直地拆除首部与尾部,失去最终传输的数据。
上图以HTTP协定为例,具体阐明。
二、数据链路层
物理层负责0、1比特流与物理设施电压高下、光的闪灭之间的调换。
数据链路层负责将0、1序列划分为数据帧从一个节点传输到邻近的另一个节点,这些节点是通过MAC来惟一标识的(MAC,物理地址,一个主机会有一个MAC地址)。
- 封装成帧: 把网络层数据报加头和尾,封装成帧,帧头中包含源MAC地址和目标MAC地址。
- 通明传输:零比特填充、转义字符。
- 牢靠传输: 在出错率很低的链路上很少用,然而无线链路WLAN会保障牢靠传输。
- 过错检测(CRC):接收者检测谬误,如果发现过错,抛弃该帧。
三、网络层
1.IP协定
IP协定是TCP/IP协定的外围,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要留神的是,IP不是牢靠的协定,这是说,IP协定没有提供一种数据未传播当前的解决机制,这被认为是下层协定:TCP或UDP要做的事件。
1.1 IP地址
在数据链路层中咱们个别通过MAC地址来辨认不同的节点,而在IP层咱们也要有一个相似的地址标识,这就是IP地址。
32位IP地址分为网络位和地址位,这样做能够缩小路由器中路由表记录的数目,有了网络地址,就能够限定领有雷同网络地址的终端都在同一个范畴内,那么路由表只须要保护一条这个网络地址的方向,就能够找到相应的这些终端了。
A类IP地址: 0.0.0.0~127.0.0.0 B类IP地址:128.0.0.1~191.255.0.0 C类IP地址:192.168.0.0~239.255.255.0
1.2 IP协定头
这里只介绍:八位的TTL字段。这个字段规定该数据包在穿过多少个路由之后才会被摈弃。某个IP数据包每穿过一个路由器,该数据包的TTL数值就会缩小1,当该数据包的TTL成为零,它就会被主动摈弃。
这个字段的最大值也就是255,也就是说一个协定包也就在路由器外面穿行255次就会被抛弃了,依据零碎的不同,这个数字也不一样,个别是32或者是64。
2.ARP及RARP协定
ARP 是依据IP地址获取MAC地址的一种协定。
ARP(地址解析)协定是一种解析协定,原本主机是齐全不晓得这个IP对应的是哪个主机的哪个接口,当主机要发送一个IP包的时候,会首先查一下本人的ARP高速缓存(就是一个IP-
MAC地址对应表缓存)。
如果查问的IP-MAC值对不存在,那么主机就向网络发送一个ARP协定播送包,这个播送包外面就有待查问的IP地址,而间接收到这份播送的包的所有主机都会查问本人的IP地址,如果收到播送包的某一个主机发现自己符合条件,那么就筹备好一个蕴含本人的MAC地址的ARP包传送给发送ARP播送的主机。
而播送主机拿到ARP包后会更新本人的ARP缓存(就是寄存IP-
MAC对应表的中央)。发送播送的主机就会用新的ARP缓存数据筹备好数据链路层的的数据包发送工作。
RARP协定的工作与此相反,不做赘述。
3. ICMP协定
IP协定并不是一个牢靠的协定,它不保证数据被送达,那么,天然的,保证数据送达的工作应该由其余的模块来实现。其中一个重要的模块就是ICMP(网络管制报文)协定。ICMP不是高层协定,而是IP层的协定。
当传送IP数据包产生谬误。比方主机不可达,路由不可达等等,ICMP协定将会把错误信息封包,而后传送回给主机。给主机一个处理错误的机会,这
也就是为什么说建设在IP层以上的协定是可能做到平安的起因。
四、ping
ping能够说是ICMP的最驰名的利用,是TCP/IP协定的一部分。利用“ping”命令能够查看网络是否连通,能够很好地帮忙咱们剖析和断定网络故障。
例如:当咱们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。个别的信息如下:
ping这个单词源自声纳定位,而这个程序的作用也的确如此,它利用ICMP协定包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请
求,受到申请的主机则用类型码为8的ICMP回应。
ping程序来计算间隔时间,并计算有多少个包被送达。用户就能够判断网络大抵的状况。咱们能够看到, ping给进去了传送的工夫和TTL的数据。
五、Traceroute
Traceroute是用来侦测主机到目标主机之间所经路由状况的重要工具,也是最便当的工具。
Traceroute的原理是十分十分的有意思,它收到到目标主机的IP后,首先给目标主机发送一个TTL=1的UDP数据包,而通过的第一个路由器收到这个数据包当前,就主动把TTL减1,而TTL变为0当前,路由器就把这个包给摈弃了,并同时产生
一个主机不可达的ICMP数据报给主机。主机收到这个数据报当前再发一个TTL=2的UDP数据报给目标主机,而后刺激第二个路由器给主机发ICMP数据
报。如此往返直到达到目标主机。这样,traceroute就拿到了所有的路由器IP。
六、TCP/UDP
TCP/UDP都是是传输层协定,然而两者具备不同的个性,同时也具备不同的利用场景,上面以图表的模式比照剖析。
面向报文
面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因而,应用程序必须抉择适合大小的报文。若报文太长,则IP层须要分片,升高效率。若太短,会是IP太小。
面向字节流
面向字节流的话,尽管应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无构造的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就能够把它划分短一些再传送。
对于拥塞管制,流量管制,是TCP的重点,前面解说。
TCP和UDP协定的一些利用
什么时候应该应用TCP?
当对网络通讯品质有要求的时候,比方:整个数据要准确无误的传递给对方,这往往用于一些要求牢靠的利用,比方HTTP、HTTPS、FTP等传输文件的协定,POP、SMTP等邮件传输的协定。
什么时候应该应用UDP?
当对网络通讯品质要求不高的时候,要求网络通讯速度能尽量的快,这时就能够应用UDP。
七、DNS
DNS(Domain Name
System,域名零碎),因特网上作为域名和IP地址互相映射的一个分布式数据库,可能使用户更不便的拜访互联网,而不必去记住可能被机器间接读取的IP数串。通过主机名,最终失去该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协定运行在UDP协定之上,应用端口号53。
八、TCP连贯的建设与终止
1.三次握手
TCP是面向连贯的,无论哪一方向另一方发送数据之前,都必须先在单方之间建设一条连贯。在TCP/IP协定中,TCP协定提供牢靠的连贯服务,连贯是通过三次握手进行初始化的。三次握手的目标是同步连贯单方的序列号和确认号并替换
TCP窗口大小信息。
第一次握手: 建设连贯。客户端发送连贯申请报文段,将SYN地位为1,Sequence
Number为x;而后,客户端进入SYN_SEND状态,期待服务器的确认;
第二次握手: 服务器收到SYN报文段。服务器收到客户端的SYN报文段,须要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,本人本人还要发送SYN申请信息,将SYN地位为1,Sequence
Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手: 客户端收到服务器的SYN+ACK报文段。而后将Acknowledgment
Number设置为y+1,向服务器发送ACK报文段,这个报文段发送结束当前,客户端和服务器端都进入ESTABLISHED状态,实现TCP三次握手。
为什么要三次握手?
为了避免已生效的连贯申请报文段忽然又传送到了服务端,因此产生谬误。
具体例子:“已生效的连贯申请报文段”的产生在这样一种状况下:client收回的第一个连贯申请报文段并没有失落,而是在某个网络结点长时间的滞留了,以至延误到连贯开释当前的某个工夫才达到server。原本这是一个早已生效的报文段。但server收到此生效的连贯申请报文段后,就误认为是client再次收回的一个新的连贯申请。于是就向client收回确认报文段,批准建设连贯。假如不采纳“三次握手”,那么只有server收回确认,新的连贯就建设了。因为当初client并没有收回建设连贯的申请,因而不会理会server的确认,也不会向server发送数据。但server却认为新的运输连贯曾经建设,并始终期待client发来数据。这样,server的很多资源就白白浪费掉了。采纳“三次握手”的方法能够避免上述景象产生。例如方才那种状况,client不会向server的确认收回确认。server因为收不到确认,就晓得client并没有要求建设连贯。”
2.四次挥手
当客户端和服务器通过三次握手建设了TCP连贯当前,当数据传送结束,必定是要断开TCP连贯的啊。那对于TCP的断开连接,这里就有了神秘的“四次离别”。
第一次离别: 主机1(能够使客户端,也能够是服务器端),设置Sequence
Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这示意主机1没有数据要发送给主机2了;
第二次离别: 主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2通知主机1,我“批准”你的敞开申请;
第三次离别: 主机2向主机1发送FIN报文段,申请敞开连贯,同时主机2进入LAST_ACK状态;
第四次离别: 主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,而后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段当前,就敞开连贯;此时,主机1期待2MSL后仍然没有收到回复,则证实Server端已失常敞开,那好,主机1也能够敞开连贯了。
为什么要四次离别?
TCP协定是一种面向连贯的、牢靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1收回FIN报文段时,只是示意主机1曾经没有数据要发送了,主机1通知主机2,它的数据曾经全副发送结束了;然而,这个时候主机1还是能够承受来自主机2的数据;当主机2返回ACK报文段时,示意它曾经晓得主机1没有数据发送了,然而主机2还是能够发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就示意主机2也没有数据要发送了,就会通知主机1,我也没有数据要发送了,之后彼此就会欢快的中断这次TCP连贯。
为什么要期待2MSL?
MSL:报文段最大生存工夫,它是任何报文段被抛弃前在网络内的最长工夫。
起因有二:
- 保障TCP协定的全双工连贯可能牢靠敞开
- 保障这次连贯的反复数据段从网络中隐没
第一点:如果主机1间接CLOSED了,那么因为IP协定的不可靠性或者是其它网络起因,导致主机2没有收到主机1最初回复的ACK。那么主机2就会在超时之后持续发送FIN,此时因为主机1曾经CLOSED了,就找不到与重发的FIN对应的连贯。所以,主机1不是间接进入CLOSED,而是要放弃TIME_WAIT,当再次收到FIN的时候,可能保障对方收到ACK,最初正确的敞开连贯。
第二点:如果主机1间接CLOSED,而后又再向主机2发动一个新连贯,咱们不能保障这个新连贯与刚敞开的连贯的端口号是不同的。也就是说有可能新连贯和老连贯的端口号是雷同的。一般来说不会产生什么问题,然而还是有非凡状况呈现:假如新连贯和曾经敞开的老连贯端口号是一样的,如果前一次连贯的某些数据依然滞留在网络中,这些提早数据在建设新连贯之后才达到主机2,因为新连贯和老连贯的端口号是一样的,TCP协定就认为那个提早的数据是属于新连贯的,这样就和真正的新连贯的数据包产生混同了。所以TCP连贯还要在TIME_WAIT状态期待2倍MSL,这样能够保障本次连贯的所有数据都从网络中隐没。
九、TCP流量管制
如果发送方把数据发送得过快,接管方可能会来不及接管,这就会造成数据的失落。所谓 流量管制 就是让发送方的发送速率不要太快,要让接管方来得及接管。
利用 滑动窗口机制 能够很不便地在TCP连贯上实现对发送方的流量管制。
设A向B发送数据。在连贯建设时,B通知了A:“我的接管窗口是 rwnd = 400 ”(这里的 rwnd 示意 receiver window)
。因而,发送方的发送窗口不能超过接管方给出的接管窗口的数值。请留神,TCP的窗口单位是字节,不是报文段。假如每一个报文段为100字节长,而数据报文段序号的初始值设为1。大写ACK示意首部中的确认位ACK,小写ack示意确认字段的值ack。
从图中能够看出,B进行了三次流量管制。第一次把窗口缩小到 rwnd = 300 ,第二次又减到了 rwnd = 100 ,最初减到 rwnd = 0,即不容许发送方再发送数据了。这种使发送方暂停发送的状态将继续到主机B从新收回一个新的窗口值为止。B向A发送的三个报文段都设置了 ACK = 1,只有在ACK=1时确认号字段才有意义。
TCP为每一个连贯设有一个继续计时器(persistence timer)。只有TCP连贯的一方收到对方的零窗口告诉,就启动继续计时器。若继续计时器设置的工夫到期,就发送一个零窗口控测报文段(携1字节的数据),那么收到这个报文段的一方就从新设置继续计时器。
十、TCP拥塞管制
1.慢开始和拥塞防止
发送方维持一个拥塞窗口 cwnd ( congestion window
)的状态变量。拥塞窗口的大小取决于网络的拥塞水平,并且动静地在变动。发送方让本人的发送窗口等于拥塞窗口。
发送方管制拥塞窗口的准则是:只有网络没有呈现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送进来。但只有网络呈现拥塞,拥塞窗口就减小一些,以缩小注入到网络中的分组数。
慢开始算法:
当主机开始发送数据时,如果立刻所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为当初并不分明网络的负荷状况。
因而,较好的办法是 先探测一下,即由小到大逐步增大发送窗口,也就是说,由小到大逐步增大拥塞窗口数值。
通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd
设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口减少至少一个MSS的数值。用这样的办法逐渐增大发送方的拥塞窗口 cwnd
,能够使分组注入到网络的速率更加正当。
每通过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经验的工夫其实就是往返工夫RTT。
不过“传输轮次”更加强调:把拥塞窗口cwnd所容许发送的报文段都间断发送进来,并收到了对已发送的最初一个字节的确认。
另,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目标是试探一下网络的拥塞状况),而后再逐步增大cwnd。
为了避免拥塞窗口cwnd增长过大引起网络拥塞,还须要设置一个慢开始门限ssthresh状态变量。慢开始门限ssthresh的用法如下:
- 当 cwnd < ssthresh 时,应用上述的慢开始算法。
- 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞防止算法。
- 当 cwnd = ssthresh 时,既可应用慢开始算法,也可应用拥塞管制防止算法。
拥塞防止
让拥塞窗口cwnd迟缓地增大,即每通过 一个往返工夫RTT 就把发送方的 拥塞窗口cwnd加1,而不是加倍
。这样拥塞窗口cwnd按线性法则迟缓增长,比慢开始算法的拥塞窗口增长速率迟缓得多。
无论在慢开始阶段还是在拥塞防止阶段,只有发送方判断网络呈现拥塞(其依据就是没有收到确认),就要把慢开始门限ssthresh设置为呈现拥塞时的发送
方窗口值的一半(但不能小于2)。而后把拥塞窗口cwnd从新设置为1,执行慢开始算法。
这样做的目标就是要迅速缩小主机发送到网络中的分组数,使得产生 拥塞的路由器有足够工夫把队列中积压的分组处理完毕。
如下图,用具体数值阐明了上述拥塞管制的过程。当初发送窗口的大小和拥塞窗口一样大。
2.快重传和快复原
快重传
快重传算法首先要求接管方每收到一个失序的报文段后就立刻收回反复确认(为的是使发送方及早晓得有报文段没有达到对方)而不要等到本人发送数据时才进行捎带确认。
接管方收到了M1和M2后都别离收回了确认。当初假设接管方没有收到M3但接着收到了M4。
显然,接管方不能确认M4,因为M4是收到的失序报文段。依据 牢靠传输原理,接管方能够什么都不做,也能够在适当机会发送一次对M2的确认。
但依照快重传算法的规定,接管方应及时发送对M2的反复确认,这样做能够让
发送方及早晓得报文段M3没有达到接管方。发送方接着发送了M5和M6。接管方收到这两个报文后,也还要再次收回对M2的反复确认。这样,发送方共收到了
接管方的四个对M2的确认,其中后三个都是反复确认。
快重传算法还规定,发送方只有一连收到三个反复确认就该当立刻重传对方尚未收到的报文段M3,而不用 持续期待M3设置的重传计时器到期。
因为发送方尽早重传未被确认的报文段,因而采纳快重传后能够使整个网络吞吐量进步约20%。
快复原
与快重传配合应用的还有快复原算法,其过程有以下两个要点:
- 当发送方间断收到三个反复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。
- 与慢开始不同之处是当初不执行慢开始算法(即拥塞窗口cwnd当初不设置为1),而是把cwnd值设置为 慢开始门限ssthresh减半后的数值,而后开始执行拥塞防止算法(“加法增大”),使拥塞窗口迟缓地线性增大。
-END-
起源 | https://juejin.im/post/684490...