miniftp

miniftp服务器是一个小型的文件传输服务器,用的是ftp协议,FTP工作在tcp/ip的应用层,传输层用的是tcp协议,基于C/S架构。
ftp所能支持的文件类型:ASCII、EBCDIC、图像文件、本地文件。
FTP工作原理:用户界面-用户协议解释器(服务器协议解释器)-用户数据传输进程(服务器数据传输进程)-文件系统
启动FTP-建立控制连接(客户端TCP协议层根据给出的服务器IP地址,向服务器提供的21端口发出主动连接的请求,通过3次握手,在用户协议解释器和服务器协议解释器进程间建立一条TCP连接)-建立数据连接(向ftp服务器发出要下载服务器上某一文件的命令,该命令被送到用户用户协议解释器)-关闭FTP
此处控制连接包括主动和被动连接
控制连接:
主动连接:
1、客户端发送port命令,创建套接字、绑定监听,顺带发送自己ip和端口
2、服务器回应200,解析ip和端口并保存,方便后续建立连接
3、客户端向服务端发送list,服务器收到list后检测是否收到port或者pasv,若没有回应425 use port or pasv first
如果接收过,并且是port,则服务器创建套接字并绑定20端口,connect,主动连接客户端的IP与端口,建立数据连接
4、服务器回应150,准备 就绪
被动连接:
1、客户端发送pasv给服务器
2、服务器回227,创建套接字,绑定监听,将ip与端口格式化的形式发送给客户端
3、客户端发送list
服务器检测收到list之前是否收到PORT或者PASV命令,如果没有收到,相应424 。。。
如果收到过,并且是PASV,则调用accept被动接受客户端连接,返回已连接的套接字,从而建立数据连接
4、服务器发送150表示就绪,可以传输
5、开始传输
6、服务器发送226应答客户端,表示数据传输结束,然后客户端主动关闭数据套接字
被动只要求服务器端产生一个监听相应端口的进程,这样就绕过了客户端安装防火墙的问题。

TCP/UDP:
TCP是面向连接的,UDP是面向无连接的
UDP程序结构较为简单
TCP可靠的字节流,UDP是基于不可靠数据报的
TCP保证数据正确性,UDP可能丢包
TCP保证数据顺序,UDP不保证
TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(最大报文生存周期)的时间后才能回到CLOSED状态。

TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的)。
同时也是在理论上保证最后一个报文可靠到达(假设最后⼀一个ACK丢失, 那么服务器会再重发一个 FIN.。这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK)

涉及TCP3次握手:
第一次握手:客户发送syn(seq=x)包到服务器,并进入syn_send状态,等待服务器确认,第二次握手:服务器收到syn包,必须确认客户的syn(ack=x+1),同时自己发送一个syn(seq=y)包,即syn+ack包,此时服务器进入syn_recv状态;第三次握手:客户端收到syn+ack包之后,向服务器发送确认包ack(ack=y+1),此包发送完毕,客户端和服务器进入完成状态,完成第三次握手。
**超时重传:**超时重传机制保障了tcp传输的可靠性。每次发送数据包时,发送的数据都有seq号,接收端会回复ack确认,发送方在发送了seq之后,等待一段时间没有收到ack,就会认为报文丢失,触发超时重传机制。
**快速重传:**接受数据的一方发现有数据包丢失掉了,就会发送ack反馈高速发送端重传丢失的报文,如果发送端连续收到相同的ack,则会触发快速重传。
流量控制:TCP滑动窗流量控制。TCP头里有一个字段是window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接受数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来,滑动窗是一种可以提高TCP传输效率的机制。
拥塞控制: 滑动窗用来做流量控制,流量控制只关注发送端和接收端自身的状况,没有考虑整个网络的通信情况。拥塞控制是基于整个网络考虑的,拥塞策略主要方法:慢启动,拥塞避免,拥塞发生,快速恢复。
四次挥手断开连接:
第一次:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方,我已经不会给你发数据了,但是主动关闭方还可以再接收数据。
第二次:被动关闭方收到FIN后,发送一个ACK给对方,确认序号为收到序号+1。
第三次:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是高速主动关闭方,我也不会给你发数据了。
第四次:主动关闭方接到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,完成四次挥手。

为什么是三次握手:可能会发生一种情况,如果有消息在一次tcp连接完成后才到达接收端,那么接收端会以为是新的连接,就会发送确认报文到发送端确认并建立连接,但发送端可能已经关闭,即是没有关闭,在没有到达syn_sent状态时,也不会响应接收端的确认信息,接收端可能就这样等待,就在网络中浪费了资源。

四次握手,第二步记录发送端报文,第三步回复收到,这里可以合二为一,能够提高连接的速度和效率。

(OSI七层对应TCP/IP四层
OSI:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP:数据链路层、网络层、传输层、应用层)
二、FTP命令列表
参数配置
空闲断开
限速:限速的关键是睡眠,如果发现当前传输速度超过最大传输速度就让进程睡眠。
连接数限制
断点续传
空闲断开:
控制连接空闲断开:安装信号SIGALRM,并启动定时闹钟
如果在闹钟到来之前没有收到任何命令,则在SIGALRM信号处理程序中关闭控制连接,并给客户421TIMEOUT的相应,并且退出会话。
数据连接空闲断开:
如果当前处于数据传输的状态,那么即使控制连接通道空闲,也不应该退出回话,实现方法,将先前设定的闹钟关闭。
数据连接通道建立了,但是在一定的时间没有传输数据,那么应该将整个会话断开
在传输数据之前安装信号,并启动闹钟
每IP连接数限制:
两个哈希表,将当前ip的连接数保存,与配置项进行比较,超过了不让登陆,当一个客户端退出时,父进程需要知道这个客户端的ip,通过pid-ip-hash查询,相对应在ip-count-hash表中找对对应的连接数,进行操作。

主进程:nobody进程/服务进程
miniftp服务器:
服务进程(客户端-FTP协议解释器-数据传输模块)–(进程间通信模块)-nodoby进程(内部协议解释器)

发布了39 篇原创文章 · 获赞 10 · 访问量 737

猜你喜欢

转载自blog.csdn.net/weixin_43393776/article/details/104394329