1、FTP 流程实例 建立命令通道 客户端 192.168.0.102 首先经由端口2529 与 FTP 服务器 221.130.2.222 端口 21 经过 TCP 三次握手建立连接,建立连接成功后,FTP 服务器返回状态码 220,表示服务就绪。登陆过程首先由终端向 FTP 服务器发送登陆用户名”gprs ”并等待验证。用户名验证通过后,FTP 服务器返回状态码 331,表示用户名验证已通过并需要输入密码。终端将登陆密码”ERICgprs”发送给 FTP 服务器,FTP 服务器验证后返回状态码 230,表示用户已经登陆。终端向 FTP 服务器发送命令 “TYPE A”,表示设置文件传输类型为
2、ASCII,FTP 服务器返回状态码 200,表示命令执行成功。2)建立数据通道 客户端请求被动模式,FTP 服务器通过 21 端口返回 227 Entering Passive Mode (221,130,2,222,193,171),服务器将开放端口 49579(193*256+171)接受来自客户端的数据连接,客户端则将使用端口 2530(2529+1)进行数据连接。然后客户端向 FTP 服务器发送命令“RETR 1M.rar”,表示要下载文件 1M.rar。指定要下载的文件后,客户端由端口 2530主动去连接 FTP 服务器端口 49579,通过 TCP 三次握手建立数据连接”FTP-
3、DATA” ,用于传输数据。建立数据连接后,FTP 服务器通过端口 21 返回状态码 150,表示文件状态正确,正在打开数据连接。3)数据传输 通过 TCP 三次握手建立数据连接时,客户端和服务器协商双方的MSS 值(即 TCP 数据包每次能够传输的最大数据分段)为 1452 个字节。服务器通过端口49579 不断向客户端口 2530 发送大小为 1452 字节的 TCP 数据包,客户端每收到 1 个或 2个数据包后返回 ACK 确认收到了数据包。可以看到 Wireshark 每次抓到的 FTP 数据大小为1506 字节,而不是以太网帧最大的 1518 字节,这是因为在物理层网卡要先去掉前导同
4、步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等) ,如果符合就将帧交“设备驱动程序”做进一步处理。这时抓包软件才能抓到数据,因此 Wireshark 抓到的是去掉前导同步码、帧开始分界符、FCS 之外的数据,少了 12 字节。第 63 和 64 两个数据包,服务器向客户端连续发送两个大小为 1452 字节的 TCP 数据包,其中第 64 个包的 Seq 为 1453。客户端收到这两个数据包后,在第 65 个包回 ACK 确认,携带的 ACK 值为
5、 2905,表示已收到 Seq1453,需要服务器下次发送 Seq 为2905(1453+1452)的数据包。4)多线程数据传输 上面只是单线程的数据传输,数据只在 49579 和 2530这对端口之间传输。如果再通过TCP 三次握手建立一个或多个数据连接用于传输,那就是多线程的数据传输。 客户端又向 FTP 服务器发送命令请求下载文件” 2M.rar”,协商的 MSS 值为1460,客户端由端口2534 主动去连接 FTP 服务器端口 9098(35*256+138) ,建立新的数据连接。3. 常用术语 MTU:Maximum Transmission Unit 最大传输单元 MTU 就是
6、IP 数据包每次能够传输的最大长度,即以太网帧的最大净载荷 payload,大部分网络设备的 MTU 都是 1500。由于以太网 EthernetII 最大的数据帧是 1518Bytes,刨去以太网帧的帧头(DMAC 目的地址 MAC48bit=6Bytes+SMAC 源 MAC 地址 48bit=6Bytes+Type 域2bytes)14Bytes 和帧尾 CRC 校验部分 4Bytes(有时候也叫做 FCS) ,那么剩下承载上层协议的地方也就是 Data 域最大就只能有 1500Bytes,这个值称之为 MTU。MTU 过大或者过小都会产生 IP 层分片,导致速率不稳,最大速率也上不去。
7、 MSS:Maximum Segment Size 最大分段大小MSS 就是 TCP 数据包的最大净载荷 payload,默认值为 1460,MTU 的值 1500Bytes 减去IP 数据包头 20Bytes 和 TCP 数据包头 20Bytes 得到 1460Bytes。为了达到最佳的传输效能,TCP 协议在建立连接的时候通常要协商双方的 MSS 值,通讯双方会根据各自提供的 MSS 最小值确定为这次连接的最大 MSS 值。 TCP 滑动窗口 当网络连接的两端速度不匹配时,发送端的发送速度快于接收端的处理能力,便会出现快速的发送端将慢速的接收端淹没的现象,导致数据丢失。为了防止由于发送端与
8、接收端之间的不匹配而导致的数据丢失,TCP 采用滑动口进行流量控制。 滑动窗口机制通过设定的数据发送区间即窗口(单位 byte)进行流控制,该窗口是接收方允许发送方发送的字节流的数据范围,发送方只能发送位于窗口内的字节流中的字节。发送方可在不超过窗口大小范围的条件下连续发送若干个分组,而不必每次发送都要在前一个分组的 ACK 确认信息收到后进行。该窗口随着发送方的出站字节流和接收方的入站字节流而滑动,发送方只有收到了接收方的 ACK 确认,窗口才可以向前移动。TCP 传输过程中的滑动窗口并不是固定不变的,在传输过程中会动态调整,接收方会不断的在 ACK 中将自己的接收窗口大小(window size)通告发送方,发送方将此作为发送窗口的大小。 发送方在两种情况下会停止发送数据:一是网络传输延迟导致发送窗口中全是已发送未确认的数据,二是接收方进程处理太慢导致接收方的接收窗口大小为 0(Zero window) 。 TCP 滑动窗口的大小会影响单线程 FTP 下载的速率,因为在时延 RTT 一定的情况下,单线程下只有一个窗口可以接收数据,这时需要修改电脑的注册表来调整窗口大小。但是当FTP 下载的线程足够多时,窗口大小的影响可以忽略。