定时器&&三次握手&&滑动窗口&&DNS

一、 TCP/IP四层模型中常见的定时器

  1. 保活定时器

    保活计时器用来防止两个TCP之间的连续出现长时间的空闲。
    假定客户已主动与服务器建立了TCP链接。然后这个客户端出现故障。在这种情况下,这个链接就会永远的处于打开状态。而服务器维护一个链接,也是要耗费一定的资源的,所以必须采取措施,使服务器不能白白等下去。
    要解决这种问题,就要对服务器设置保活计时器。每当服务器收到客户的信息,就将计时器复位,保活时间通常设置为2小时。若服务器过了两小时还没有收到客户的信息,他就发送一个探测报文,以后每隔75秒就发一次,连续发送10个探测报文后客户端仍然没有响应,服务器就认为客户端出现了故障,接着就关闭这个链接。http长连接时会用到

  2. 超时重传定时器

    当TCP发送报文段时就创建超时重传定时器,若在时间到之前收到了对应端的回应消息则撤销定时器,否则若超过时间还没有收到则认为发送的报文对端没有收到,然后重新发送报文,并重置定时器

  3. 坚持定时器

      假设TCP收到了一个窗口大小为0报文段,发送TCP就停止传送报文段,直到接收TCP发送一个非零的窗口大小。但是这个非零窗口大小的确认,有可能丢失,若确认丢了,接收TCP并不会知道,而是认为他已经完成任务了。但是发送TCP由于没有收到确认,就会一直等待接收方发送确认来通知窗口的大小。双方的TCP这时就会造成死锁,所以要使用一个计时器来避免死锁的发送。
      当TCP收到一个窗口大小为0的确认时,就要启动坚持计时器。当坚持计时器期限到时,发送TCP就发送一个特殊的探测报文,这个探测报文段只有一个字节数据,它有一个序号,但是它的序号永远不需要确认。探测报文段提醒对端,确认已丢失,必须重传。
      坚持计时器的值设置为重传时间的数值。若没有收到从接收端来的响应,需要发送一个探测报文,并将坚持计时器的值加倍和复位,直到这个值增大到门限值(通常60秒)为止。在这以后,发送端每隔60秒发送一个探测报文,直到窗口重新打开。

  4. 时间等待定时器

    1. 主动关闭一方会进入TIME_WAIT状态,被动关闭一方要确定主动关闭一方发送的最后一次ACK回应可以收到
    2. 防止有其他链接再次链接上已经断开的链接。因为链接一般存活的时间为MLS时长。(在实际socket编程中可以通过setsockopt来设置端口复用)
      http://blog.csdn.net/lf_2016/article/details/60468161

二、TCP三次握手建立连接

  1. 三次握手

    三次握手状态图
    这里写图片描述

      TCP的三次连接中,客户端是主动链接,服务器是被动连接,整个过程有三次数据报文段的传送,所以TCP建立过程又称为三次握手。
    服务器进程先创建传输控制块TCB,准备接受接受客户进程的连接请求,然后服务器进程就处于LISTEN(收听)状态,等待客户端的连接请求。传输控制块TCB里面存储了每一个连接中的一些重要信息,比如:TCP连接表、到发送和接受缓存的指针,到重传队列的指针,当前的发送和接受序号。

  2. 连接的步骤

    1. 客户端的进程也是先创建传输控制块(TCB),然后向服务器发出连接请求报文段。这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN=1的报文段不能携带数据,但要消耗一个序号。这时客户进程进入SYN-SENT(同步已发送)状态。
    2. 服务器收到连接请求报文段后,如果同意连接,则向客户进程发送确认。在确认报文中,SYN=1,ACK=1,确认号是x+1,同时也为自己选择一个初始序号seq=y。这时服务器进程进入SYN-RCVD(同步收到)状态。
    3. 客户进程收到服务器的确认之后,还要再向服务器发出确认。确认报文段中,ACK=1,确认序号ack=y+1,而自己的序号是seq=x+1。TCP规定,ACK可以携带数据,但如果不携带数据的话则不消耗序号。
      这时TCP连接建立,客户端进入连接状态(ESTABLISHED)。当服务器收到确认之后,也立即进入已连接(ESTABLISHED)状态。
  3. 为什么要第三次握手呢???

      这主要是为了防止已失效的的连接请求报文段。 假设,客 户端发出连接请求报文段,但是该连接请求报文段在某个网络节点中长时间滞留,导致客户端因为超时又发送第二个链接请求报文段 。第二个连接请求与服务器建立连接,而第一个连接请求报文段 以至于延误到连接释放以后才到达服务器。本来这个连接早已经失效了,如果只采用两次握手的话,服务器会误认为客户端又发送了一次连接请求,从而统一建立连接。所以,采用三次握手可以很好的避免这个问题。

http://blog.csdn.net/lf_2016/article/details/60479280

三、TCP四次握手释放链接

  1. 四次握手释放图
    这里写图片描述
  2. TCP连接释放步骤
    1. 客户端进程先向TCP发出连接释放报文段,并停止再次发送数据,主动关闭TCP连接,客户端把链接请求释放报文段首部的FIN置1。这时客户端TCP进入FIN-WAIT-1(终止等待1)状态,等待服务器的确认。TCP规定,FIN报文段即时不携带数据,他也消耗掉一个序号。
    2. 服务器收到连接释放报文段后立即发送确认,然后服务器就进入CLOSE-WAIT(关闭等待)状态。这时服务器的TCP协议通知应用程序,从客户端到服务器的链接就要释放了。这时链接就处于半关闭状态,也就是客户端已经没有数据要发了,但是服务器要发送数据的话,客户端仍要接受,也就是从服务器到客户端这个方向的连接并未关闭。
    3. 客户端在接受到来自服务器的确认之后,就进入FIN-WAIT-2(终止等待2)状态。等待B发出连接释放报文段。 若服务器已经没有数据要发送给客户端了,这时服务器的TCP就要释放链接,服务器向客户端发出连接释放报文段,FIN=1。
    4. 客户端在接受到服务器的连接释放报文段后,必须对此进行确认。在确认报文段中ACK=1。然后客户端进入TIEM_WAIT(时间等待)状态。
      服务器只要收到了来自客户端的确认,就立即进入CLOSED(关闭)状态。然后再回收传输控制块后,就结束了这次TCP连接。
      当客户端的超时等待计时器结束之后,客户端立即进入CLOSED状态。然后再回收传输控制块后,就结束了这次TCP连接。
  3. 为什么要等2MSL

    这最主要是因为两个理由:

  1. 为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

  2. 他还可以防止已失效的报文段。客户端在发送最后一个ACK之后,再经过经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

注意:在服务器发送了FIN-ACK之后,会立即启动超时重传计时器。客户端在发送最后一个ACK之后会立即启动时间等待计时器。

四、滑动窗口协议与停等协议的区别

  1. 滑动窗口协议就是A给B发数据时会声明自己的窗口大小是多少,就是接收缓冲区还有多少空闲,B给A发数据也一样,一旦满了就停下来等待有空闲再发
  2. 有一种情况会用到坚持定时器,如果B已经告诉A自己的缓冲区已满,于是A停止发送数据、等待一段时间后,B的缓冲区出现了富余,告诉A我的缓冲区有空闲了,来发数据吧,但是这个报文不幸丢失了,于是就出现了A等待B的通知,B也等待A数据的死锁状态,为了处理这种问题,引入了坚持定时器,每当有0窗口发送时,都会启动坚持定时器,坚持定时器的时间到了就发送一个一字节的探测报文,对方会在此时回应自己接收窗口的大小,如果结果仍然为0,则重设建行次计时器,继续等待。
  3. 停等协议(1比特滑动窗口)接受方和发送方的窗口大小都是1比特,一般用于网络环境较差,或带宽低的情况。

五、DNS的概念,DNS查询算法

  1.   DNS域名系统是分布式的系统(即使单个计算机出了故障也不影响其他)当某一个应用进程要把主机名解析为IP时,该应用进程就调用解析程序并成为DNS的一个客户,把解析的域名放在DNS请求报文中,以UDP用户数据包方式发送给本地服务器(使用UDP是为了减少开销),本地域名服务器在查找域名后把对应的IP地址放回在报文中返回,应用进程获得母的主机的IP地址后就可以进行通信。
      若本地域名服务器不能回答该请求,则此域名服务器就暂时成为DNS中的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。
  2. 查询算法

      主机向本地域名服务器的查询一般都是采用递归查询,即如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。因此,递归查询返回的查询结果或是所要查询的IP地址,或是报错。
      本地域名服务器想根服务器的查询通常采用迭代查询,即当根域名服务器收到本地域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器“下一次应向那个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。根域名服务器通常把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个权限域名服务器进行查询。本地域名服务器就这样进行迭代查询。

转载于:https://www.cnblogs.com/readlearn/p/10806414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值