yifangzhuhou

导航

今日刷题总结13

CIDR

即无类域间路由(Classless Inter-Domain Routing),其基本思想是适当将多个IP地址进行聚合以减少这些地址在路由表中的表项数。

CIDR对原来用于分配A、B和C类地址的有类别路由选择进程进行了重新构建。它使用13到27位长的前缀取代原来地址结构对网络部分的限制(A、B和C这3类IP地址的网络部分分别规定为8、16和24位)。CIDR 地址中包含标准的32位IP地址和有关网络前缀位数的信息。以CIDR地址222.80.18.18/25为例,其中“/25”表示其前面地址中的前25位代表网络部分,其余位代表主机部分。CIDR建立于“超级组网”的基础上,“超级组网”是“子网划分”的派生词,可看作子网划分的逆过程。子网划分时,从地址主机部分借位,将其合并进网络部分;而在超级组网中,则是将网络部分的某些位合并进主机部分。这种无类别超级组网技术通过将一组较小的无类别网络汇聚为一个较大的单一路由表项,减少了Internet路由域中路由表条目的数量。

参考https://baike.baidu.com/item/%E6%97%A0%E7%B1%BB%E5%9F%9F%E9%97%B4%E8%B7%AF%E7%94%B1/240168?fr=aladdin

私有地址

IANA保留了3块IP地址做为私有IP地址:

A类:10.0.0.0 ——— 10.255.255.255

B类:172.16.0.0——— 172.16.255.255

C类:192.168.0.0———192.168.255.255

TCP连接的建立与释放

tcp连接的建立使用c/s方式,主动发起连接请求的进程叫做客户,被动接受连接请求的进程叫做服务器。下图是tcp连接建立的示意图,其中主机A为tcp客户端,主机B为tcp服务器端。最初两端都处于closed状态。连接建立的过程大致如下:

(1)B的tcp服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求,接着服务器进程就进入listen状态并等待客户的连接请求。

(2)A的tcp客户进程也创建传输控制块TCB,然后向B发送一个连接请求报文,报文的首部中SYN位被置为1,并选择一个序列号seq为x。tcp规定SYN报文不携带数据,但是要消耗掉一个序列号。此时客户端进程进入SYN_SENT状态。

(3)B的tcp服务器进程接受到A的连接请求报文,并向A发送确认报文。该报文首部中的ACK以及SYN位都置为1,确认号ack=x+1,同时选择一个序列号seq=y。确认报文同样也不携带数据,但必须消耗掉一个序列号。此时,tcp服务器进程进入SYN_RCVD状态。

(4)A的客户端进程收到B的确认报文后,需要向B发送确认报文。该报文首部的ACK位置1,确认号为ack=y+1,如果需要携带数据,则序列号为seq=x+1,否则不需要消耗一个序列号。此时tcp连接已经建立,客户端进程进入ESTABLISHED状态。

(5)B服务器进程接收到确认报文后也进入ESTABLISHED状态。

为什么tcp建立连接需要3次握手而不是2次?假设A发送了一个连接请求报文给B,但是该报文却滞留在网络节点中,于是A重发一个连接请求报文并且后来与B建立了连接。当A与B之间的数据传送完毕并释放连接后,本来滞留的报文又延期到达B。如果建立只有两次握手过程,B会误认A又重新发起了一个连接请求,于是向A发送确认报文同意建立连接,此时tcp连接已经建立。然而A并不会发送数据给B,B却一直等待A传送的数据,这样就浪费了B的资源。如果是三次握手,A在接收到B的确认报文后不会发送确认,B没有得到确认就知道A没有建立连接的要求。

数据传输完毕后,A和B任意一方都可以主动提出关闭连接,这里假设A主动关闭,下图为连接释放的状态转变图。

(1)开始时,两端都处于established状态。A的客户端进程停止传送数据,发送一个连接释放报文给B的服务器进程,该报文首部的FIN位置1,序列号seq=u,其中u为最后已传送数据最后一个字节的序列号加1,也就是说FIN报文不携带数据但要消耗掉一个序列号。然后A进入FIN-WAIT-1状态并等待B的确认。

(2)B的服务器进程接收到连接释放报文后,向A发送一个确认报文,该报文首部的ACK位置1,确认号ack=u+1,序列号seq=v,其中v为已传送数据最后一个字节的序列号加1,然后B就进入CLOSE-WAIT状态。此时tcp连接处于半关闭状态,A没有数据发送给B,但B仍可能有数据需要发送给A。

(3)A收到来自B的确认后进入FIN-WAIT-2状态并等待B发出的连接释放报文。

(4)B数据发送完毕,向A发送一个连接释放报文,其首部FIN位置1,序列号seq=w,并且重复发送确认号ack=u+1。此时B进入LAST_ACK状态并等待A的确认。

(5)A在收到B的连接释放报文后会发出确认报文。该报文首部的ACK位置1,确认号ack=w+1,序列号seq=u+1,然后进入到TIME-WAIT状态。此时tcp连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入到CLOSED状态。A撤销传输控制块TCB后就结束了这次tcp连接。

(6)B收到了A发出的确认就进入CLOSED状态,B在撤销传输控制块TCB后就结束了这次tcp连接。

为什么A在TIME-WAIT状态必须等待2MSL?

(1)为了保证A最后一次的ACK确认报文能够被B接收到。这个确认报文可能会丢失,因此处在LAST-ACK状态的B会因为没有收到确认而超时重传FIN+ACK报文,这样A就能在2MSL时间内就可以接收到重传的报文。接着A重传一次确认报文,重新启动2MSL计时器。最后A和B都能正常进入CLOSED状态。如果A没有TIME-WAIT状态直接进入CLOSED并释放连接,那么就无法收到B重传的FIN+ACK报文,因而也不会重传确认报文。这样B无法正常进入CLOSED状态。

(2)防止上文提到的滞留在网络节点的失效请求连接报文出现在此次连接中。A在发送完最后一个确认报文后,等待2MSL时间可以使在这个连接中产生的所有报文都从网络消失,这样在下次发动新的连接时不会出现这种旧的连接请求报文。

参考自《计算机网络(第5版)》(谢希仁著)

posted on 2017-08-18 19:05  yifangzhuhou  阅读(159)  评论(0编辑  收藏  举报