协议,即网络协议,是通信的计算机双方必须共同遵守的一组约定。
在这里,以文件传输为例写一个协议文档。
需求:
现有客户端和服务器端,客户端要向服务器端传输一个文件,服务器收到文件校验正确后返回响应,制定一个协议服务器的文件上传协议。
需求分析:
在上传前,对于要传输的文件本身,要有一个约定:
- 文件名:文件命名要符合文件命名规范,主要包括文件名长度,格式等。,根据需求的不同命名规范不同。
- 文件大小:上传文件的大小要符合服务器端的限制。上传的文件大小可以无限制,但是文件过大的话可能会造成客户端卡顿等现象。对于服务器来说,大文件也是一个考验,会消耗性能。
- 文件标识:对于上传的文件要有一个唯一性标识,以便于服务器检验上传的文件的正确性,例如通过文件指纹(MD5)技术验证。
在确定了上传文件得相关约定后,就可以上传了,同样的,对于上传的过程也要有一个约定:
- 客户端准备将文件上传给服务器,此时先发送消息给服务器提出上传请求。
- 服务器在收到请求后,做好相关准配置准备工作等待上传并回复允许发送消息。
- 客户端收到回复后,上传文件和文件的基本校验信息。
- 服务端在接收到文件后,对文件进行校验,确认上传过程中文件没有被更改,是客户端要上传的文件,给客户端一个上传成功回复。
至此,在明白了需求后,就可以去实现了。
文件上传协议制定:
上面需求分析已经得出协议分为两部分——连接和传输,所以协议也分为两部分。
- 通信协议:确定通信协议为tcp/ip协议。
- 连接协议:
制定连接协议头,包含具体的字段信息和对于字段的描述等内容。
见下表:
字段 | 类型 | 大小 | 描述 |
---|---|---|---|
name | string | 文件的命名规范 | |
size | int32 | 2GB | 上传的文件内容的最大值 |
md5 | string | 文件的指纹,用来验证文件传输的唯一性 |
要上传的文件要符合表中要求才能上传。
- 传输协议:
制定传输连接协议见下图:
箭头①表示客户端向服务器发送请求:想要发送文件,客户端将标志位SYN=1的数据包发送给服务器,并生成一个seq=J。然后客户端进入SYN_SENT状态,等待回复。
箭头②表示服务器收到SYN=1的数据包后,将标志位SYN和ACK都设置为1,并且ack=J+1,随机产生seq=K。然后将数据包发送给客户端确认连接,服务器进入SYN_RCVD状态,等待文件。
箭头③表示客户端收到数据包后,确认ack是否为J+1,ACK是否为1,正确则将标志位设置为1,ack=K+1。然后将数据包再次发送给服务器,服务器检查ack是否为K+1,ACK是否为1,正确则建立连接。客户端就可以上传文件了。
箭头④表示服务器收完文件后,检查文件的指纹验证是否是要上传的文件,是则回复给客户端上传成功。
至此,一份简单的文件上传协议文档就写好了!