首页 > 代码库 > 计算机网络的传输层的简单介绍:
计算机网络的传输层的简单介绍:
在应用层下为传输层,如TCP与UDP;
传输层与网络层之间的不同: 传输层负责信息在主机进程与服务器进程之间的传递; 网络层负责信息在主机与服务器之间的传递; 差了一个进程啊;
传输层的信息用:segment 表示;它是这样得到的:把应用层的message 分成一块块,然后再加上传输层的文件头;
另外,TCP的信息也会用segment表示,UDP的信息用datagram(数据报)表示;网络层上的message也用datagram表示;
UDP:user datagram protocol; 它只会进行两个服务:1, 进程之间的数据交付;2,error checking;
TCP: transmission control protocol; 它进行的服务比较多,因为它是可靠传输;如:数据流控制等;
多路复用与多路分解:
由于传输层的作用是把信息交付给不同的socket, 所以呢,在应用层与传输层之间需要用到了多路复用与多路分解;
多路复用指:不同的socket的信息加入身份确认标志,统统变为为segment,然后用传输层交给了下面的网络层进行传送;
多路分解指:把很多segment交付给不同的socket;
要求:1, 存在不同的socket以及对应的端口;2, 每一个segment上应该用用于identify的field,里面的信息为源端口与目的端口;
(补:端口的范围为0-65536,其中0-1023不能随便用,因为它是专用的,如HTTP等 或保留着呢,其它的可以随意用了;)
在一个传输层的segment中的用于识别的字段结构如下图,头占了8个字节:
无连接的多路利用/分解与面向连接的多路利用/分解
UDP的多路利用/分解:一个UDP socket使用目的主机的IP与目的主机的端口来确定;
TCP的socket:由源IP、源端口、目的IP、目的端口来确定;(一开始的握手segment除外), 所以呢,TCP的socket可以有相同的端口,如WEB服务器的端口好像都是80吧(无端建立连接的socket还是用于传输数据的socket);
UDP:
很简单,它把应用层的数据加一个头就变为了UDP的segment. 它的segment的结构如下图所示:
它的头包括4个fields, 每一个field的大小为:2字节;内容分别为: 源端口,目的端口,数据的长度和checksum(用于纠错);
下面的application data,为应用层的数据;
可靠的传输:
问题1:如何解决发送的packet有误的问题??
解决方法:版本1:当receive收到消息以后,就回复一个ACK(acknowledgment), 如果没有收到的消息出错了,就发送一个NAK,表示让发送者再重新发一遍;
进级:为每一个信息加一个sequence numbeer, 当收到的信息有误时,不发送该消息的NAK了,而是发送上一个收到的正确的消息的ACK;
问题2: packet在发送过程中,如果Loss怎么办?
解决方法:加入消息重发机制; 当数据loss后,发送者肯定就收不到ACK信息了, 加入一个计时器timer,超过一定的时间就重发;
问题3:如何提高传输的效率?
解决方法:采用流水线设计,具体为: go back N 和 selective repreat;
(里面有一些细节,省略不写,例如:要求未回应的信息的个数不大于N,等)
TCP:
它的结构如下图:
它的头,占了20个字节;
总的来看TCP,
最主要的三点吧:
第一,如何进行可靠的传输,包括内容与顺序; 解决方法:对于错误的或loss的进行重传, 对于不是顺序的可以进行丢弃或缓存下来;
其中,怎么判断的问题:一个是timeout,一个是收到3个同一字段有ACK; 对于ACK,TCP采用的是accumulative 的方法,这一点很重要的;
另外的怎么计算timeout的时间啦,怎么重发等细节省略;
第二点: 对于如何解决flow 问题与confession问题,方法基本相同,就是控制发送方的rate(或窗口大小), 但是两者的原因不同,一个是因为接收者上层应用接收的慢,一个是由于网络堵塞; 对于如何把出现上述原因的情况反馈给发送者呢: 前者使用ACK信息里的的相应字段来解决;后者根据ACK到达发送者的状态,如loss了,还是收到了3个多余的重复的ACK来判断,其中当然还有细节;
第三点: 如何使用流水线进行提高效率的问题:关键字:并行发,consequence number, ACK number, 还有一个发送窗口;
另外,对于三次握手的建立过程的原理,字段的作用等,也很有意思;可以利用这个原理写端口扫描工具啦,进行网络攻击等;
参考:计算机网络第六版,自顶向下;
计算机网络的传输层的简单介绍: