首先对计算机网络有一定基础的同学一定知道OSI的网络七层架构,这是一个理想化的网络架构模型。它既复杂也不实用,从上至下分别是:应用层,表示层,会话层,运输层,网络层,数据链路层和物理层,而现实真正得到广泛应用的其实是基于 TCP/IP的四层网络结构:应用层,运输层,网际层(用网际层这个名字是为了强调这一层是解决不同网络的互联问题),网络接口层。从实质上讲TCP/IP只有最上面的三层,因为最下面的网络层接口基本上和一般的通信链路没有什么区别,对于计算机网络来说没有特别的新的东西,在我们学习计算机网络时通常结合OSI七层模型和TCP/IP四层模型进行综合学习,结合两者的优点,采用一种五层模型进行学习,既:应用层,运输层,网络层,数据链路层,物理层,今天这篇文章将要学习和分析的是位于运输层的TCP协议。
运输层:运输层的主要任务就是负责两个 主机进程 间的通信提供通用的数据传输服务,运输层向它的上层应用层提供服务,应用进程 利用该服务传送应用层报文。 (注意:通信的不是主机,而是主机中的进程)
TCP: 传输控制协议(Transmission Cotrol Protol),是一个面向连接的,可靠的端到端的传输协议,其数据传输单位是:报文段
TCP的主要特点:
1 .面向连接的运输层协议
2 . 每一条tcp连接只能有两个端点,每条tcp连接只能是点对点的
3 .TCP提供 可靠交付 服务,通过TCP传输的数据无差错,无丢失,无重复,并且按序到达
4 .TCP提供全双工通信,允许通信双方的进程在任何时候都能发送数据,TC连接的两端都设有发送缓冲和接收缓冲,用来临时存放数据(发送时,将数据发送到缓冲,应用就可做自己的事,TCP在合适的时候把数据发出,同理接收时,数据先放入缓存,上层的应用进程合适时读取缓存)
5 .面向字节流,TCP中流入到进程和进程流出的都是字节序列,TCP把应用程序传递下来的数据看成是一连串无结构的字节流,并不知道字节流的含义,TCP不保证数据发送方发送到数据块数量和接收方接收接收的数据块数量一致,因为发送方可能发送10个数据块,但接收方用4个数据块来接受全部信息,但是数接收方接收到的字节流必须和发送方发送的字节流完全一样, TCP不关心应用程序一次写入多少数据到缓存,而是根据对方给出的窗口值和当前网络拥塞程度,来决定一个报文段应包含多少字节
什么是面向连接?
是指在传输数据前必须先建立连接(逻辑连接:并非水平方向上的直接连接),数据传输结束后再释放连接
什么是连接?
连接 是TCP中最基本的抽象,我们上文有提到说,TCP的 每条连接 都是点对点的,一条连接对着两个端点,那这个端点是什么?其实也就是我们常说的 套接字(Socket) ,套接字是什么?根据RFC793的定义: 套接字(socket)=(IP地址+端口号) ,所以说两个通信的套接字可以确定一条连接,而 连接 其实就是通信的两个端点(套接字)之间的一个逻辑抽象。
TCP协议是基于网络层的IP协议的,IP协议是不可靠的,为什么说TCP是可靠的?
因为在不可靠的网络层之上,TCP是实现了停止等待协议和ARQ等协议,来保证数据报文传输的可靠性
可靠传输原理
我们知道,TCP发送的报文段,会交给IP层进行传递,而IP层只能提供最大努力通知服务,也就是说TCP下面的网络层传输是不可靠的的,所以TCP需要采取比必要的措施来保证运输层中的通信可靠。
停止等待协议
全双工通信,双发既可以是发送方也可以是接收方,为理解方便,我们定义A发送数据给B, A为发送方,B为接收方,我们把传送的数据单元成为分组(不考虑具体是在哪层传输的,不同层的叫法不同),停止等待就是每发送完一个分组,就等待对方的的确认,收到确认后再发送下一个分组。 正常情况: A发送一个分组,B确认一个分组,以此下去直到发送完毕。 但是一直无差错是不可能的,数据包传输的过程中可能丢失,也可能B收到后检测错误直接丢弃,对于B来说,没收到分组,或者分组检测有误丢弃,是不会给A报告信息的。所以可靠的传输协议就是如下设计的,A如果一段时间内没有接收到B的确认,就认为刚才的分组丢失了,所以就重传前面发过的分组,这就是 超时重传,要实现超时重传,就必须设置一个超时计时器,如果规定时间内收到确认,就撤销该计时器,否则就重传。
重传细节
1.A发送完分组后,必须暂时保留一个分组的副本或者备份,防止重传,只有收到确认后才清除。
2 .分组和确认分组都必须编号,这样才能明确哪一个发出的分组得到了确认。
3 .超时计时器设置的重传时间应当比分组传输平均往返时间长一些
确认丢失和确认迟到
B发送的确认分组丢失了,那么A在超时重传的时间内没有收到确认就会重新发送,但是A无法确认是自己发出的分组丢失出错,还是B发送的确认丢失了,如果是B的确认丢失了,此时A重传的分组已经收到,那么B需要进行一下两个处理:
1 . 丢弃接收到的A重传的分组
2 .向A发送确认,防止A继续重传。
B对分组的确认延迟,这样就会导致A收到重复的确认,对重读的去人处理比较简单,收下后丢弃,B任然回收到重复的分组,同样丢弃分组,重传确认分组即可。
使用上述的确认和重传机制,就可以实现在不可靠的网络上实现可靠的通信,上述的这种可靠的传输协议被成武自动重传请求ARQ(Automatic Repeat reQuest)。
停止等待协议简单,但是缺点也明显,信道利用率太低,所以为了提高发送速率,发送方可以不使用抵消的停止等待协议,而是采用 流水线传输
流水线传输:发送方可以连续发送多个分组,不必发完一个分组就停下来等待确认,这样可以使得信道上一直有数据不间断的传送。这种方式可以获得很高的信道利用率。使用流水线传输时需要使用 连续ARQ协议和滑动窗口协议
待续。。。。。