1.2.3 TCP
在数据传输中,可以认为有两个信封,TCP和IP就像是两个信封。要传递的信息被划分成若干段,把每段塞入一个小的TCP信封,并在该信封上记录分段号的信息,再将TCP信封塞入大的IP信封,把IP信封发送到网络中。在接收端,一个TCP软件包收集信封,抽出数据,按发送前的顺序还原,并加以校验,若发现差错,则TCP将会要求重发。因此,TCP/IP在Internet中几乎可以无差错地传送数据。
在上面的例子中,在大信封上写明了接收地址,而里面的内容就是要传送的数据。下面就来看一下TCP头(见图1-10)的写法,从而理解传输的原理。
图1-10 TCP头
TCP协议头的组成说明如下。
●源端口号、目标端口号字段:各占16位。TCP使用"端口"来标识源端和目标端的应用进程。端口号可以使用0~65 535的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。
●序号字段:占32位。序号用来标识从TCP源端向TCP目标端发送的数据字节流,也就是数据被分成很多包并传送到目的地后,按这个序号进行排列才能得到正确的内容。
●确认号字段:占32位。只有ACK标志为1时,确认号字段才有效。它表示目标端期望收到源端的下一个数据字节。
●头部长度字段:占4位。它给出头部占32位的数目。没有任何选项字段的TCP头部长度为20字节,其最多可以有60字节。
●保留字段:为TCP的扩展预留的字段。
●标志位字段:占6位。标志位中各位的含义如下。
URG:紧急指针。URG为1表示紧急指针域有效。
ACK:确认序号有效。
PSH:接收方收到报文后应该立即将这个报文段交给应用层,而不是在缓冲区中排队。
RST:连接报错之后,重建连接,用来复位错误的连接。
SYN:发起一个连接。和ACK标志位一起使用以完成三次握手的连接。
FIN:报文传递完毕之后,释放一个连接,表示TCP连接终止。
●窗口大小字段:占16位。此字段用来控制流量,单位为字节,这个值是本机期望一次接收的字节数。
●校验和字段:占16位。该字段对整个TCP报文段(即TCP头部和TCP数据)进行校验和计算,并由目标端进行验证。
●紧急指针字段:占16位。它是一个偏移量,与序号字段中的值相加表示紧急数据中最后一个字节的序号。
●可选项字段:占32位。该字段可能包括"窗口扩大因子""时间戳"等选项。
1.2.4 TCP中的3次握手和4次挥手
建立TCP连接需要3次握手,而断开TCP连接则需要4次挥手。
3次握手的过程如图1-11所示。
图1-11 3次握手的过程
●第1次握手:客户端发送一个TCP的SYN标志位置1的包以指明客户打算连接的服务器端口,以及初始序号X,X保存在包头的序号字段里。
●第2次握手:服务器返回确认包的应答。SYN标志位和ACK标志位均为1。
●第3次握手:客户端再次发送确认包,这时SYN标志位为0,ACK标志位为1。同时,把服务器发来的ACK序号字段加1,并放在确认号字段中发送给对方。
断开TCP连接时要4次挥手,如图1-12所示。
●第1次挥手:客户端A发送一个FIN消息以停止从客户端A到服务器B的数据传送。
图1-12 4次挥手的过程
●第2次挥手:服务器B收到这个FIN消息后,返回一个ACK消息,确认序号为收到的序号加1。同SYN一样,一个FIN消息将占用一个序号。
●第3次挥手:服务器B断开与客户端A的连接,发送一个FIN消息给客户端A。
●第4次挥手:客户端A返回ACK报文以进行确认,并将确认序号设置为收到的序号加1。
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。