TCP封包格式
2010-02-08 17:02:31| 分类: 软件技术 | 标签: |字号大中小 订阅
一、双向传输
TCP是一个双向的
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
。换言之,当A、B之间建立好连网后,A可以传送数据给B,而B也可以传送数据给A。
如下图所示
双向传输的特点:
A → B与A ← B管道各有一组Sequence / Acknowledge Number与Send / Receive Window,因此整个TCP连网会有2个Sequence Number、2个Acknowledge Number、2个Send Window,以及2个Receive Window。值得注意的是,A、B之间互传的封包,可以同时包含A → B与A ← B的资料。例如:A传送Packet 1给B此封包Payload部分当然是属于A → B传送管道,但是报送部分则可记录A → B的Sequence Number,以及A ← B的Acknowledge Number。
二、TCP连网
所有TCP的传输都必须在TCP连网(TCP Connection)中进行。因此,TCP连网的建立、跟上可说是TCP的基本工作。
1、识别连网
如何定义一条TCP连网?
TCP连网是由连网两端的IP地址与连接商品编号(即端口号)所定义:
2、建立连网
开始建立连网时,一定会有一方为主动端(Active),另一方为被动端(Pawwive)。
以WWW为例,客户端的浏览器通常扮演主动端的角色,而服务器端的Wed Server通常是被动端的角色。
连网建立之初,主要是让双方知道对方使用的各项TCP参数。亦即,在建立连网时,必须交换以下信息:
(1)双方的Initial Sequence Number。
(2)双方的Window Size。
(3)双方支持的TCP选择性功能(后文会再详述TCP选择功能)。
整个连网建立的过程称为“Handshaking”,也就是双方一见面时要先握手打招呼,讲好如何建立连网。
Handshakingr的步骤,每个步骤各有一个TCP封包。
第1步骤
A首先总支出第1个TCP封包给B,我们称它为SYN封包。此封包除了指明A、B双方的连接端口编号外,还必须包含以下信息:
1、Sequence Number:指定A→B的Initial Sequence Number,我们称之为ISN(A→B)。Sequence Number最随机产生的数字,长度为4Bytes。
2、Acknowledge Number:指定A←B的Acknowledge Number。因为现在还不知道A←B的Sequence Number为何,因此Acknowledge Number先设为0。
3、SYN Flag:这是TCP报头中的一个标示位,用来
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
明此封包的Sequence Number为Initial Sequence Number,而非一般的Sequence Number。
SYN是Synchronize(同步)的缩写,意思是说借助ISN可将A的Sequence Number与B的Acknowledge Number同步化。
3、Window Size:A预设Receive Window的大小,在此我们称之为Window(A←B)。它可用来控制B的Send Window大小,借此达成A←B的流量控制。
第2步骤
B在收到SYN封包后,接着会回复一个SYN-ACK封包。其中包含了以下信息:
1、Sequence Number:指定A←B的Initial Sequence Number,我们称之为ISN(A←B)
2、Acknowledge Number:指定A→B的Acknowledge Number。从SYN封包可得知A→B的Initial Sequence Number。在A→B传输管道中,SYN封包可算是Bytes Stream中的1个Byte,因此SYN-ACK封包的Acknowledge Number等于SYN封包的ISN(A→B)再加上1。
3、YN-ACK Flag:用来表明此封包的Sequence Number为Initial Sequence Number(A←B),同时表示Acknowledge Number包含了确认收到的信息。
4、Window Size:B默认Receive Window的大小,称为Window(A→B)。它可用来控制A的Send Window大小,藉此达成A→B的流量控制。
第3步骤
A在收到SYN-ACK封包后,接着会再发出一个ACK封包,其中包含了以下信息:
1、Sequence Number:A→B的Sequence Number,因为第1步骤中的SYN封包占用了Bytes Stream中的1个Byte,所以此处的Sequence Number等于第1步骤SYN封包的ISN(A→B)再加上1。
2、Acknowledge Number:指定A←B的Acknowledge Number。从第2步骤的SYN-ACK封包可得知A←B的Initial Sequence Number。同理,在A←B传输管道中,SYN封包可算是Bytes Stream中的1个Byte,所以此处的Sequence Number等于第2步骤SYN-ACK封包的ISN(A←B)再加上1。
3、ACK Flag:表示Acknowledge Number包含了确认收到的信息。
4、Window Size:A的Receive Window大小,亦即Window(A←B)。
建立连网的3个步骤可总结成如下的示意图:
TCP数据传输实例演示:
一、终止连网
TCP连网若要终止,必须经由特定的连网终止步骤,才能将连网所用的资源(连接端口、存储器等等)释放出来。请读者注意,虽然建立连网时可区分为主动端与被动端,但是双方都可以主动提出终止连网的要求。
连网终止的过程共有4个步骤,每个步骤各有一个TCP封包。接着我们便以A作为主动提出连网终止为例,说明连网终止的过程。
第1步骤
A首先送出第1个TCP封包给B,我们称它为FIN-ACK封包,其中包含了以下信息:
1、Sequence Number:指定A→B的Sequence Number,因为A→B已完成传输,因此称之为Final Sequence Number,我们以FSN(A→B)来表示。
2、Acknowledge Number:指定A←B的Acknowledge Number。
3、FIN-ACK Flag:FIN是Finish(完成)的缩写,意思是说A→B已经传输完毕,ACK表示Acknowledge Number包含了确认收到的信息。
4、Window Size:与一般相同,以下省略。
第2步骤
B送出ACK封包给A,其中包含了以下信息:
1、Sequence Number:指定A←B的Sequence Number。
2、Acknowledge Number:指定A→B的Acknowledge Number。由于FIN封包会占用1Byte,所以此处Acknowledge Number等于第1步骤FIN-ACK封包的FSN(A→B)再加上1。
3、ACK Flag:表示Acknowledge Number包含了确认收到的信息。
此步骤结束后,代表成功地终止A→B传输管道。不过,A←B可能还有数据需要传送,所以A←B传输管道仍旧继续维持畅通,直到传送完成才会进入第3步骤。
第3步骤
当B完成A←B的传输后,便送出FIN-ACK封包给A,其中包含了以下信息:
1、Sequence Number:指定A←B的Sequence Number,因为已完成传输,因此称之为FSN(A←B)。
2、Acknowledge Number:指定A→B的Acknowledge Number。由于第1步骤结束后,A便不再传送数据给B,所以此处的Acknowledge Number与第2步骤的Acknowledge Number相同,皆为FSN(A→B)+1。
3、FIN-ACK Flag:代表A←B已经传输完毕,且Acknowledge Number包含了确认收到的信息。
第4步骤
A送出ACK封包给B,其中包含了以下信息:
1、Sequence Number:指定A→B的Sequence Number。由于第1步骤的FIN封包会占用1Byte,所以此处Sequence Number等于第1步骤FIN-ACK封包的FSN(A→B)再加上1。
2、Acknowledge Number:指定A←B的Acknowledge Number。由于第3步骤的FIN封包会占用1Byet,所以此处Acknowledge Number等于第3步骤FIN-ACK封包的FSN(A←B)再加上1。
3、ACK Flag:表示Acknowledge Number包含了确认收到的信息。
二、TCP封包格式
1、TCP数据的封装
2、TCP封包格式
1) TCP 封包是由以下两部分所组成:
TCP报头TCP数据
TCP报头:记录源端与目的端应用程序所用的连接端口编号,以及相关的Sequence Number、Acknowledge Number、Window Size等等。
TCP数据:载送上层协议(Application Layer)的信息。这部份可视为TCP Payload,不过一般都称为TCP Segment,本章我们将之称为“TCP数据” 。
2)TCP封包的各个字段
Source Port (源连接端口编号)
长度为2Bytes,记录A上层应用程序所用的TCP连接端口编号。
Destination port (目的连接端口编号)
长度为2Bytes,记录B上层应用程序所用的TCP连接端口编号。
Sequecne Number (序号)
长度为4Bytes,记录TCP数据的第1Byte,A→B传输管道Bytes Stream中的编号。
Acknowledge number (回应序号)
长度为4Bytes,记录A←B传输管道中,已收到连续性数据在A←B Bytes Stream中的编号。
Window (窗口大小)
长度为2Bytes,设定A的Receive Window大小,用来控制A←B的流量。一般而言,若A有充裕的时间处理A←B传送来的数据时,A的 Receive Window可变大:若A过于忙碌而无暇处理A←B传送来的数据时,A的Receive Window会变小。
Acknowledge
设为1时代表Acknowledge Number字段包含了确认信息。
Synchronize
Synchronize Flag设为1时,代表Sequence Number字段记载的是Initial Sequence Number,换言之,此封包为连网建立时第1或第2步骤的封包。
Checksum(校验和)
长度为2Bytes,记录错误校验和。TCP在计算机错误校验和时,会加上TCP Pseudo Header。其运作方式与UDP的错误校验和完全相同,在此不再赘述。