TCP协议简介
UDP是一种没有复杂控制,提供面向无连接通信服务的一种协议。换句话说,它将部分控制转移给应用程序去处理(例如TFTP),自己却只是提供作为传输层协议的Zui基本功能。
TCP与UDP不同,TCP则“人如其名”,可以说对“传输、发送、通信”进行“控制”的“协议”。
TCP与UDP区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
TCP VS UDP
TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。
UDP是一种面向无连接的通信协议,因此不检查对端是否可以通信,直接将UDP包发送出去。TCP与此相反,它会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理(FIN包)。
可以使用TCP首部用于控制的字段来管理TCP连接,一个连接的建立与断开,正常过程至少要来回7个包才能完成。
TCP首部报文格式
源端口号(Source Port)表示发送端端口号,字段长16位。
目标端口号(Destination Port)表示接收端端口号,字段长度16位。
序列号(Se)字段长度32位。序列号(有时也叫序号)是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或1开始,而是在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但也也会以一个字节增加对应的序列号。
确认应答号(Acknowledgement Number)确认应答号字段长度32位。是指下一次应该收到的数据的序列号。实际上,它是指已经收到(确认应答号-1)为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据已经被正常接收。
数据偏移(DataOffset)[TCP首部长度] 该字段表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,当然也可以把它看作TCP首部的长度。该字段长4位,单位为4字节(即32位)。不包括选项字段的话,TCP的首部为20字节长,因此数据偏移字段可以设置为5。反之,如果该字段的值为5,那说明从TCP包的Zui一开始到20字节为止都是TCP首部,余下的部分为TCP数据。
保留(Reserved)该字段主要是为了以后扩展时使用,其长度为4位。一般设置为0,但即使收到包在该字段不为0(安全问题),此包也不会被丢弃。
控制位(ControlFlag)字段长度8位,每一位从左到右分别为URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫做控制位。当它们对应位上的值为1时,具体含义如下图所示。
1、URG (Urgent Flag)
该位为1时,表示包中有需要紧急处理的数据。对于需要紧急处理的数据,会在后面的紧急指针中再进行解释。
2、ACK (Acknowledgement Flag)
该位为1时,确认应答的字段变为有效。也就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为0。
3、PSH(Push Flag)
该位为1时,表示需要将收到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。