网络-传输层

Posted by Young Ken on 2017-10-16

传输层

传输层和网络层构成网络协议的核心。因为网络层是不可靠的,传输层的目标是让网络层更加可靠。

传输层服务

给上层提供服务

每个网络协议的重要职责都有给上层提供服务,传输层是针对每个机器的,也就是这个协议都是允许在用户的主机上,网络层是运行在路由器上的。传输层的服务也分为面向链接和无连接服务两种,两种连接都有经过建立链接,数据传输和释放链接三个步骤。

传输服务原语

看一下TCP的socket的原语。

  • SOCKET

    创建一个新通信端点

  • BIND

    将套接字与一个本地地址关联

  • LISTEN

    声明愿意接受一个连接,给出队列长度

  • ACCEPT

    被动创建一个入境连接

  • CONNECT

    主动创建一个连接

  • SEND

    通过连接发送一些数据

  • RECEIVE

    从连接上接收一些数据

  • CLOSE

    释放连接

传输协议的要素

寻址

当一个应用想和另一个应用通信的时候,必须指明那个是那个应用进程上。通常情况下会为每个服务定义一个连接地址,这个连接地址叫做端口(port)。

连接建立

其实建立连接是比较复杂的事情,涉及到建立连接的包丢失,延时等等问题,我们就具体讨论一下这里的问题。

我们想象一个场景,用户和一个银行建立连接,给一个账号汇款,这个时候数据包选择了一个新的很绕的路线,不幸的是数据包超时了,发送端补发数据,银行很快就接收到了补发数据,汇款完成。但是开始的那个另辟蹊径的数据包到了,要求建立一个连接并且汇款,问题就这样产生了。

上面的问题在于从复的数据包,我们针对这问题进行了解决,设计了杀死从复数据包的方案,主要手段是增加了另辟蹊径的数据包的生存难度。

  • 限制网络设计
  • 在每个数据包中设置一个跳计数器(好像这个手段很长用啊 )
  • 为每个数据包打上时间戳

为了解决重复包问题,从复建立连接,在传输层采用了三次握手的策略。

A先向B发出一个随机数x,B收到x了以后,发给A另一个随机数y以及x+1作为答复,这样A就知道B已经收到了,因为要破解随机数x可能性并不大;然后A再发回y+1给B,这样B就知道A已经收到了。这样,A和B之间就建立一个可靠的连接,彼此相信对方已经收到并确认了信息。

而事实上,A并不会知道B是否收到了y+1;并且,由于信道的不可靠性,x或者y都是可能被截获的,这些问题说明了即使是三次握手。

到现在为止我们一定在想,为什么是三次,两次不行吗,四次呢?这里我们举一个例子说明一下。

在这里我们引入非常有意思的问题,两军对垒问题,现在有两个军队要进行决胜,分别是蓝军和白军。白军被两部分蓝军包围在了山谷里,而只有全部的蓝军一起进攻才能取得胜利。这个时候要你设计一个协议,通知两部分蓝军同时进攻,但是有个前提,送信的信使必须经过白军,白军有概率捕获信使。

B1(蓝军1号)写了一封信,说”我们明天10开始进攻”,(这个时间的定义意味着,从现在到明天10点能完成你的协议通讯)。信使如果在送信中被捕,通讯是被。如果成功到达,B2(蓝军2号)会回复B1,“可以啊!”。信使拿着信去B1,如果顺利,信使到达B1。这时候B1知道B2同意进攻了,但是现在有个很重要的问题来了,B2不知道B1是否收到信,所有信使必须在把信送回到B2,告诉B1收到了。

但是先有个问题,就是B1犹豫了,因为他不知道B2是否收到消息,我们要是设计四次握手呢。这样就无尽循环下去了。这是时候我们利用反证法,也就是最后一条消息非常重要,不可丢失。那么就是三次握手。因为只有第三次握手后才能发动进攻。

连接释放

连接建立了,最后要进行断开,同样断开也没那么简单。

当主机A发送一个释放连接的请求给B,A启动一个定时器。B接到这个请求,也启动了一个定时器,并发送断开连接消息给A,A接到消息断开连接,同样A发送消息给B,B接到消息断开链接,这个是最好的情况。

这里有个最好的情况,就是(d),B超时释放连接,A经过多次超时释放连接。