专业术语
ACK:一个控制标记,表示TCP报头中“确认号”字段是有意义的。
“确认号”字段:TCP报头中的一个字段,表示计算机准备接收的下一个序列号。它实际上确认了之前的全部顺序字节的接收。
主动打开:TCP尝试发起一个连接时的状态。
面向连接的协议:通过在通信计算机之间建立连接来管理通信的协议。
无连接的协议:不与远程计算机建立连接就进行通信的协议。
控制标记:1位标记,表示关于TCP数据分段的特殊信息。
多路分解:把一路输入导向多个输出。
目的端口:目的计算机上的应用程序所使用的TCP或UDP端口,这个应用程序将接收TCP数据分段或UDP数据报中的数据。
FIN:一个控制标记,用于关闭TCP连接的过程。
防火墙:保护网络免受Internet非法访问的设备。
初始序列号(ISN):一个数值,表示计算机将通过TCP传输的一系列字节的开始值。
多路复用:把多个输入合成一个输出。
被动打开:TCP端口(通常是一个服务器应用程序)准备好接收连接的状态。
端口:为应用程序与传输层协议提供接口的内部地址。
伪报头:从IP报头派生出来的一个结构,用于计算TCP或UDP校验和,从而避免数据报由于IP报头信息的变化而发送到错误目的。
重新排序:整理接收到的TCP数据分段,恢复它们被发送时的顺序。
序列号:与TCP传输的字节相关联的唯一的序号。
滑动窗口:接收端计算机允许发送端计算机发送的序列号范围。这种滑动窗口方式的流量控制是由TCP使用的。
套接字:特定计算机上特定应用程序使用的网络地址,由计算机的IP地址和应用程序的端口号组成。
源端口:发送TCP数据分段或UDP数据报的应用程序的TCP或UDP端口。
面向流的处理:连续输入(一个字节一个字节的),而不是以预定义的数据块输入。
SYN:一个控制标记,表示正在进行序列号同步。这个标记用于TCP连接开始时的三次握手过程。
TCP:TCP/IP协议簇中一个面向连接的、可靠的传输层协议。
三次握手:同步序列号并建立TCP连接的一个三步骤过程。
UDP:TCP/IP协议簇中一个无连接的、不可靠的传输层协议。
熟知端口:常见应用程序所使用的预定义标准端口号,是由IANA指定。
原理图解
一、熟知的TCP端口
二、熟知的UDP端口
三、多路复用/多路分解
套接字寻址系统使得TCP和UDP能够执行传输层另一个重要任务:多路复用和多路分解。多路复用是指把多个来源的数据导向一个输出,而多路分解是把从一个来源接收的数据发送到多个输出
多路传输/多路分解让TCP/IP协议栈较低层的协议不必关心哪个程序在传输数据。与应用程序相关的操作都由传输层完成了,数据通过一个与应用程序无关的管道在传输层与网际层之间传递。
多路复用和多路分解的关键就在于套接字地址。套接字地址包含了IP地址与端口号,为特定计算机上的特定应用程序提供了一个唯一的标识。参见下图中的FTP服务器。所有客户端计算机使用熟知的TCP端口21连接到FTP服务器,但针对每台个人计算机的目的套接字是不同的。类似地,运行于这台FTP服务器上全部网络应用程序都使用服务器的IP地址,但只有FTP服务程序使用由IP地址和TCP端口号21组成的套接字地址。
多路传输/多路分解让TCP/IP协议栈较低层的协议不必关心哪个程序在传输数据。与应用程序相关的操作都由传输层完成了,数据通过一个与应用程序无关的管道在传输层与网际层之间传递。
多路复用和多路分解的关键就在于套接字地址。套接字地址包含了IP地址与端口号,为特定计算机上的特定应用程序提供了一个唯一的标识。参见图6.6中的FTP服务器。所有客户端计算机使用熟知的TCP端口21连接到FTP服务器,但针对每台个人计算机的目的套接字是不同的。类似地,运行于这台FTP服务器上全部网络应用程序都使用服务器的IP地址,但只有FTP服务程序使用由IP地址和TCP端口号21组成的套接字地址。
四、TCP数据格式
源端口(16位):分配给源计算机上的应用程序的端口号。
目的端口(16位):分配给目的计算机上的应用程序的端口号。
序列号(32位):当SYN标记不为1时,这是当前数据分段第一个字节的序列号;如果SYN的值是1,这个字段的值就是初始序列值(ISN),用于对序列号进行同步,这时第一个字节的序列号比这个字段的值大1(也就是ISN加1)。
确认号(32位):用于确认已经接收到的数据分段,其值是接收计算机即将接收的下一个序列号,也就是下一个接收到的字节的序列号加1。
数据偏移(4位):这个字段表示报头的长度,也就是告诉接收端的TCP软件数据从何开始。这个值的单位是32位的字。
保留(6位):保留字段,为TCP将来的发展预留空间,目前必须全部是0。
控制标记(分别占用1位):控制标记用于表示数据分段的特殊信息。
URG:为1时表示当前数据分段是紧急的,也会让“紧急指针”字段的值有意义。
ACK:为1时表示“确认号”字段是有意义的。
PSH:为1时让TCP软件把目前收到的全部数据都通过管道传递给接收应用程序。
RST:为1时会重置连接。
SYN:为1时表示序列号将被同步,说明这是一个连接的开始。请参见稍后介绍的三次握手。
FIN:为1时表示发送端计算机已经没有数据需要发送了。这个标记用于关闭一个连接。
窗口(16位):用于流量控制的参数。它定义了发送端计算机的发送序列号可以超过最后一个已确认序列号的数量。也就是说,发送方不必等待每个数据段被确认接收之后才发送下一个数据分段,允许已经确认接收的序列号与正在发送的序列号有一定差别,但必须在适当范围之内。
校验和(16位):用于检验数据分段的完整性。接收端计算机会根据接收到的数据分段计算校验和,并且把结构与这个字段的值进行比较。TCP和UDP在计算校验和时包含一个具有IP地址的伪报头。
紧急指针(16位):这是一个偏移量指针,指向标记紧急信息开始的序列号。
选项:指定一些可选设置中的某一项。
填充:额外填充的0(根据需要),以确保数据从32位字的边界开始。
数据:数据分段中的数据。
六、三次握手
为了让序列/确认系统正常工作,计算机必须对序列号进行同步。换句话说,计算机B必须知道计算机A的初始序列号(ISN),计算机A也必须知道计算机B使用什么ISN开始传输数据。
这个序列号同步的过程被称为三次握手。三次握手总是发生在TCP连接建立的初期,其步骤如下:
1.计算机A发送一个数据分段,其中的参数是:
SYN=1
ACK=0
序列号=X(X是计算机A的ISN)
处于主动打开状态的计算机(计算机A)发送一个数据分段,其中的SYN为1,ACK为0。SYN是同步(synchronize)的缩写,它表示在尝试建立一个连接。第一个数据分段的报头中还包含初始序列号(ISN),标记了计算机将传输的第一个字节的序列号。也就是说,要发送给计算机B的第1个字节的序列号是ISN加1。
2.计算机B接收到计算机A的数据分段,返回一个数据分段,其中的参数是:
SYN=1(仍然在同步阶段)
ACK=1(“确认号”字段将包含一个值)
序列号=Y(Y是计算机B的ISN)
确认号=M+1(其中的M是从计算机A接收到的最后一个序列号)。
3.计算机A向计算机B发送一个数据分段,确认收到计算机B的ISN:
SYN=0
ACK=1
序列号=序列中下一个号码(M+1)确认号=N+1(其中N是从计算机B接收到的最后一个序列号)
在这三次握手完成之后,连接就被打开了,TCP模块就利用序列和确信机制发送和接收数据。
七、UDP数据报
源端口:这个字段占据UDP报头的前16位,通常包含发送数据报的应用程序所使用的UDP端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,发送端的应用程序不是一定要把自己的端口写在这个字段中。如果发送端的应用程序不写入其端口号,就应该把这个字段全置为0。显然,如果这个字段没有包含有效的端口地址,接收端的应用程序就不能发送响应。然而有时这可能正是我们想要的功能,比如单向消息就不需要响应。
目的端口:这16位字段包含的端口地址是接收端计算机上UDP软件使用的端口。
长度:这16位字段以字节为单位表示UDP数据报的长度。这个长度包括了UDP报头和UDP数据载荷。因为UDP报头的长度是8字节,所以这个值最小是8。
校验和:这16位字段可以检验数据在传输过程中是否损坏。校验和是对二进制数据串执行特殊计算而得到的结果。对于UDP来说,校验和是基于伪报头、UDP报头、UDP数据和填充的0而计算的。源计算机生成校验和,目的计算机对它进行检验,让客户端用用程序能够判断数据报是否完整。
----------------------------------------------------------------------
笔记整理自《TCP/IP入门经典(第5版)》感兴趣可以购买或者下载电子书
----------------------------------------------------------------------