传输层 5.3 TCP协议
Posted zhongzhenhua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传输层 5.3 TCP协议相关的知识,希望对你有一定的参考价值。
这节课我们来学习一下TCP协议的特点以及TCP报文段的格式。
首先呢我们来看一下TCP有哪些特点呢。之前我们说过TCP它是一个比较可靠的面向连接的协议,所以最主要的特点它是可以面向连接的一种传输层协议。那之所以说面向连接呢就是指应用程序在使用这个TCP协议之前,必须要先建立好一个TCP的连接,在传输数据完毕之后呢再释放这个已经建立的连接。也就是说俩应用进程之间的通信啊好像就是在打call一样,啊只要两个人电话打通了才可以进行数据的传输,也就是TCP它面向连接的一个特点。那这里面为什么说它是虚连接呢?这其实跟我们之前讲传输层逻辑通信是一样的道理,它并不是实际的一个物理连接,因为实际上这个连接过程应该是啊把这个数据报加上各个层次的首部之后,放到链路上面传输,然后再到接收端进行一步又一步的解封装。这个是一个完整的物理连接。但是TCP协议的使用呢,就好像两个进程之间建立一个一点对另一点的这种点对点的连接,好像是进程和进程直接连在一起了,所以我们说是一种虚连接。
第二个特点呢是就是每一条TCP连接只能有两个端点,也就是说每一个TCP连接只能是点对点,一对一的。所以TCP协议呢是没办法用于广播以及多播的这种通信方式。
那第三点呢就是TCP它可以提供可靠交付的服务,可以使得报文段无差错、不丢失、不重复、按顺序地到达。总结下来呢就是可靠有序,不丢不重。
第四个特点呢就是TCP是可以提供全双工通信的。那全双工指的就是发送方和接收方它们俩这个角色是不定的,啊两个人可以同时发送数据也可以同时接收数据。啊这就是全双工通信的一个特点。
那由于这种全双工通信的特点呢,这个TCP协议的两端都会设置有发送缓存以及接收缓存。啊发送缓存大家就可以想象成是一个啊准备发送的一个队列,接收缓存呢就是一个准备接收的队列。那发送缓存它当中包含什么呢?主要是这两类的数据。一类是准备发送的数据,也就是应用层已经准备好有待发送没有放到链路上的数据。第二类呢就是已经发送但是还没有收到
这节课我们来学习一下TCP的连接管理。
那我们在之前学过,这个TCP它是要面向连接的一种协议。面向连接,也就是一种可靠的协议。那通过面向连接呢,就建立了一点和一点之间的这种点对点、一对一的通信。那在通信的时候呢是可以采用全双工的通信方式,也就是这个两台主机呢它们既可以做数据的发送方,也可以同时作为这个数据的接收方。那我们说过,TCP面向连接的这种方式呢,就特别像你在打电话。那我拿起电话,啊拨通了这个电话号之后呢就可以开始跟你聊天了。聊完天之后,我把这个电话再挂断。那我们刚刚建立的通话连接呢也就暂时关闭了。那其实TCP连接也是这样一个过程。
它需要经过三个阶段,第一个呢就是连接的建立。第二个阶段就是数据的传输。第三个阶段呢就是连接的释放过程。那对于TCP连接的两个端点,或者说两个主机的两台进程,啊它们采用的是客户和服务器的方式。那这个客户服务器呢其实就是在说,通信的两个端点两个主机,它们两个的角色是不一样的。主动发起连接建立的应用进程呢就叫做客户,而被动等待连接建立的应用进程呢就叫做服务器。虽然它们的角色不同,但是它们都可以接收数据并且发送数据。
那我们接下来先看一下TCP连接建立的一个过程。其实呢就是同学们非常熟知的三次握手,在这里面我们举一个例子。假如说这儿有一个男生,他想跟另一个女生说话。啊他就说有件事不知当讲不当讲,那这个女生就回复说当讲,你说吧。那这个男生就会回复,好的!就相当于对这个女生确认回复的一个确认回复。然后呢这个男生就可以开始滔滔不绝地讲自己想说的东西,也就是进入到了第二阶段,数据传送阶段。那可以看到,如果这个男生和女生分别是客户端以及服务器端的话,那其实就代表了TCP连接建立的三次握手过程。
那接下来我们来具体看一下。假设运行在一台主机也就是客户端上的一个进程想要和另一台主机也就是服务器端上的进程建立一条连接进行通信。客户应用进程呢就会首先通知客户TCP,其实也就是告诉传输层现在呢我想要跟另一台主机当中的一个进程通信了,那麻烦你使用TCP协议,帮我建立好连接,并且把我的数据传输过去。那客户当中的这个应用进程呢就会使用TCP协议,来通过以下的步骤与服务器当中的这样一个进程建立一条TCP的连接。
那这个就是连接建立的一个图示。首先呢我们来看第一步。主机现在想要跟服务器通信,也就是想使用服务器的服务。首先它就会先发送一个报文段。那这个报文段呢就是由客户端发送的连接请求报文段,那这个报文段的特点它是没有应用层数据的,也就是这个报文段它没有数据部分,只是一个连接请求的作用。那考试的重点呢是考查我们对于这几种报文段,也就是三次握手过程当中所产生报文段当中啊首部的一些非常重要的字段。
首先我们来看,在这个第一个,也就是这个连接请求报文段当中,有两个字段非常重要。第一个呢就是这个SYN,也就是我们上节课讲的6位控制位当中的同步位。那这个同步位如果置为1呢就代表这是一个连接请求,或者说是连接请求的接受报文。那因此对于连接请求报文段,要将SYN这一位置为1,同时呢对于这个seq,啊这个seq其实就是上节课所讲的这个序号。序号位呢它是占32位,也就是占了4个字节。那这个序号位是随机产生的,是由这个主机内部随机产生一个序号,可以从一开始,也可以从任意一个随机数开始。那至于确认号呢,在这里面是没有效的。因为首先,客户端没有收到服务器端发过来的报文段,因此客户端就不知道自己接下来应该期待什么,不知道应该期待啊服务器端发来哪个序号的报文段,所以这个时候呢,确认序号它是没有意义的。那当然,在6个控制位当中的大写ACK,也就是确认这一位,它是0,现在是0。
那接下来我们再来看第二个阶段。
这节课我们来学习一下TCP的可靠传输。
那在之前呢我们学习过网络层,这一个层次呢它提供的是一个尽最大努力交付的,不可靠的一种传输方式。因此呢,它的上层就要担负起可靠传输的职能。那上一层呢就是传输层,而传输层有两个非常重要的协议,UDP和TCP。那UDP我们之前讲过它是一个不可靠传输的协议,但是这里面TCP呢是一个可靠传输的协议。因此呢,网络层如果不能可靠传输的话,传输层就可以通过TCP,来实现可靠传输。那如果使用的是UDP协议呢,就要靠上层的应用层来实现这个可靠传输了。
那我们一直在讲的这个可靠传输,可靠指的是什么呢?啊指的就是保证接收方进程从缓存当中读出的字节流与发送方发出的字节流是完全一样的,也就是我发送的是1、2、3、4、5,那你收到的应该也就是这种按序的而且不丢失的1、2、3、4、5。那这节课我们要讲的TCP可靠传输总共有四种实现办法,或者说有四种可靠传输的机制,分别是校验、序号、确认以及重传。
那这个校验呢,在这里面就简单地提一句,因为它和上节课我们讲的UDP协议的校验方式是完全一样的,都是通过在发送方和接收方增加一个伪首部,然后通过使用二进制反码求和的计算方法来判断有没有发生错误,那这个就是校验的方式。那接下来序号、确认和重传机制呢,其实我们在之前的一些例子当中也有提及过,这里面我们再来看一下。
首先就是这个序号的机制。我们之前讲过,TCP协议呢它是面向字节流的,那因此我们这个TCP在传输的时候就是按照这样一个字节为单位,所以我们就会把一个字节编上一个序号,第一个字节就是序号1,第二个字节序号2,啊依次类推。那当然对于一个文件或者要发送的数据,它的第一个字节,这个序号是多少,是可以随机的。那当然在实际发送的时候呢,我们是以报文段为单位,啊虽然我们说TCP是面向字节流,但是在发送的时候它如果把一些字节放在一起,组成一个报文段,然后再把这个报文段发送出去。
那这个报文段的大小呢,也是不定的。啊可以是三个字节、三个字节、两个字节、两个字节,这只是比较少的情况。那也可以多个字节,几十个字节、几百个字节形成一个报文段都可以。那这个报文段的大小划分呢就要取决于链路层它的MTU,也就是最大传输单元来决定。所以根据刚才所讲的呢,我们就知道一个字节它是占用的一个序号的。同时有关于序号呢,我们在TCP报文段格式的时候也学习过了一个序号字段。那这个序号字段指的就是一个报文段它的第一个字节的序号。那比如说这样第一个报文,1、2、3这三个字节组成的报文段。啊这个报文段它首部当中的序号字段呢应该就是1,填写的就是第一个发送的这个字节的序号。那有了这个序号呢,就可以保证数据能够有序地提交给应用层。而基于这个序号机制呢,我们就产生了接下来的确认以及重传机制。
我们先结合一个例子来理解一下这个确认的过程。假如说这个是发送方,发送方的TCP缓存当中呢,现在有这些个报文段。那这个就是接收方。
首先发送方要给接收方发送第一个报文段,也就是1、2、3字节所构成的这样一个报文段。那发过去之后呢,接收方就收到了,并且存储在自己这个TCP缓存当中,然后呢再找一个合适的时间,把这个缓存当中的数据或者说把缓存当中的报文段上传上去,提交给应用层。那可以看到,现在这个发送方TCP缓存当中,还是有1、2、3字节组成的报文段。啊这是为什么呢?因为我们知道,如果这个网络太过于复杂的话,啊或者说网络上面出现了一些问题,有可能就导致这个TCP报文段发生了丢失现象。也就是这个第一个报文段1、2、3字节,它们在传输的过程当中丢失了,那因此呢接收方就收不到这样一个报文段。啊所以接收方它可能就会让这个发送方再重新传一次,因为接收方它为了要保证可靠传输,就应该使得发送方发送的所有数据它都能够按序地、完整地接收到。所以这个发送方就要一直保持着这样一个报文段,直到呢接收方告诉它我确定收到了,然后发送方才可以把这个报文段拆除掉或者是从缓存当中删去。那这个发送方如何知道接收方正确地而且是完整地接收到了这个报文段呢,就是靠我们这个确认机制。
接收方收到了这个报文段之后呢,就会返回
以上是关于传输层 5.3 TCP协议的主要内容,如果未能解决你的问题,请参考以下文章