3. 传输控制协议(TCP)
3.1 TCP协议的主要特点
(1)TCP是面向连接的传输层协议。即使用TCP协议之前必须先建立TCP连接。在传送数据完毕之后,必须释放己经建立的TCP连接。
(2)每一条TCP连接只能有两个端点,即只能是一对一的。
(3)TCP提供可靠交付服务,也就是说通过TCP连接传送的数据,无差错、不丢失、不重复且按序发送。
(4)TCP提供全双工通信。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。这就允许通信双方在任何时候都可以发送数据。
(5)面向字节流
①TCP中的“流”是指流入到进程或从进程流出的字节序列。“面向字节流”的含义是:是指TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。它并不知道所传送的字节流的含义(如是一个整型或自定义的结构体),其含义由应用层的接收双方自行协商的,但到了传输层其意义就不存在了。
②UDP发送的报文长度是应用程序给了的。但与UDP不同,如果应用程传送到TCP缓存的数据块太长,TCP就会把它划分得短一些再传送。如果应用程序一次只发一个字节,TCP会等待积累到足够多字节后再构成报文发送出去。一个TCP报文段的大小,只是根据对方给出的窗口值和当前网络的拥塞程度来决定的。
3.2 TCP报文的首部格式
(1)抓包分析TCP
(2)TCP首部
①TCP报文分为首部和数据两个部分。TCP的全部功能都体现在它首部的各个字段的作用,只有弄清首部各字段的作用才能掌握TCP的工作原理。
②TCP首部的前20个字节是固定的,后面的4N个字节是根据需要而增加的(N为整数),因此TCP首部的最小长度是20字节。
3.3 TCP首部各字段含义
(1)源端口和目的端口:各占2个字节。和UDP一样,使用端口号来标识不同的应用层协议。
(2)序号:占4个字节,共232个序号,序号从0开始,增到最大时,下一个序号会循环回到0。一个TCP连接中传送的字节流的每一个字节都按顺序编号。而序号字段表示本报文段所发送的数据的第一个字节的序号。
(3)确认号:占4个字节,是期望收到下一个报文段的第一个数据字节的序号。应记住:若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。
(4)数据偏移:占4位二进制,单位是4字节。它指出TCP报文段的数据起始处距离TCP报文段的起始的偏移,实际上就是指出TCP报文段的首部长度。
(5)保留:占6位。保留为今后使用,但目前应置为0。
(6)紧急URG(Urgent)。当URG=1时,表示紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序传送。(注意,该标志位只是告诉TCP,优先发送本报文段。但接收方是否优先把该数据报尽快交付(推送)给应用程序是由push标志位来决定的)
(7)确认ACK(Acknowlegment):当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
(8)推送(Push):当两个应用进程进行交互的通信时有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。(即接收方优先接收这个数据包,就优先交付给其上的应用程序,而不再等到整个缓存都填满后再向上交付!)。实际中很少使用该字段。
(9)复位RST(Reset):当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
(10)同步SYN(Synronization):在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对*同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1。因此,SYN置1就表示这是一个连接请求或连接接受报文。
(11)终止FIN(Finish):用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据己发送完毕,并要求释放传输连接。
(12)窗口 。占2个字节。窗口值是[0,216-1]之间的整数,主要起着流量控制的作用。其意义在于告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位是字节)。
①由于TCP的确认机制也让TCP连接双方的数据传输速度变慢,也就是说,一方发送数据需要等待对方的确认才继续发送后续数据。为了充分利用双方的带宽及缓冲区(Buffer),发送方不必等待对方的确认,可以连续发送多个数据包给对方,而对方可以暂时把这些数据存放在缓冲区,并给对方一个总确认。这样,可以大大增加数据传输的速度。
②可见,之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。使用TCP协议传输数据的计算机会根据自己的接收能力让对方参数这个窗口值来调整数据发送的速率,从而达到流量控制的功能。
(13)检验和。占2个字节。检验的范围包括首部和数据这两个部分。其检验方法与UDP类似,也要临时添加一个伪首部。只是伪首部的第4个字段的17改为16,第5个字段的UDP长度改为TCP长度。若使用IPv6,则伪首部也要相应的改变。
(14)紧急指针。占2个字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),由于紧急数据是从数据部分的开始处算起,因此,紧急指针也是紧急数据的长度。
(15)选项:长度可变,最长可达40个字节。当没有使用选项时,TCP的首部长度是20个字节。该选项中通常可以设置MMS、窗口扩大选项和时间戳等。
①TCP最长报文段长度(MMS),并不是整个TCP报文段的最大长度,而是数据字段的最大长度。
②受数据链路层最大传输单元(MTU)的限制,以太网的MTU默认是1500字节。因此TCP报文段数据部分的最大长度(MMS)为1460字节。
③若选择较小的TCP报文段太小,则网络的利用率就低。反之,如果TCP报文段太长,那么在IP层就可能被分解成多个短数据报片,当传输出错时要进行重传以及到达终点还要还原成原来的TCP报文,这些都会使网络开销增大。
④因此,MMS应尽可能设置大些,只要在IP层传输时不需要再分片就行。若主机未填写MMS,默认为536字节。因此所有因特网上的主机都应能接受的报文长度是536+20(固定首部长度)=556字节。