三次握手过程:
第一次握手:主机A发送同步位码SYN=1,并产生随机序列码seqnumber,将这些数据包发送到服务器,服务器由A发送过来的同步位码SYN=1知道主机A请求建立到服务器的连接。
第二次握手:服务器知道主机A要建立连接后做出反应,返回确认码ACK=1和确认码序列号,这个序列号是A发送过来的随机序列号加1(seqnumber+1),表示服务器确实收到了信息并且正确。同时服务器还要发送自己的同步位码SYN=1及产生服务器端的随机序列号,将这些数据包返回到主机A,以确认在能收到主机A信息的情况下,主机A能否正确的接受来自服务器的信息。
第三次握手:主机A收到来自服务器的确认信息后,对其发过来的同步位码做出反应,只返回确认码ACK及序列码,这个序列码是来自服务器的随机序列码加1,依此来告诉服务器我能正确接受你发回来的信息。
完成上述过程后,客户端和服务器就建立了正确的连接,这就是一个请求-应答-再次确认的过程
在三次握手连接好服务器后,需要发送一些信息来登录和获取双方的信息:
连接成功后,服务器会返回欢迎信息
220 welcome to ……
完成之后,客户端要依次发送用户名和密码到服务器实现登录。。。这个发送和接收用的是send和recv函数,里面都是绑定好服务器地址和端口的套接字,以及要发送的信息。
首先客户端发送用户名:
USER 用户名
中间有个空格,以回车和换行结尾
服务器对此作出反应,当正确时返回:
331 please specify the password…
然后客户端发送密码过去:
PASS 密码,要求同上。
服务器对发送过来的用户名和密码综合考虑,若正确,返回:
230 Login successful.Have fun…..
若不正确,则返回:
530 Login incorrect…….
这些返回信息,只要判断数字就可以,其他提示可能不同;对正确的连接,服务器返回的数字都是2或3开头的,其他开头的都说明不正确的连接。
要断开与服务器的连接,需要完成四次挥手过程:
首先要认识控制位FIN,它代表结束标志,带有该符号的数据包用来结束一个TCP回话,表示我不会再发有用的数据给你了,注意是有用的数据,并不是我啥都不给你发送了。
第一次挥手:客户端A发送结束位FIN及随机序列号到服务器,用来关闭客户端到服务器的数据传输,但是此时服务器依然可以发送数据到客户端
第二次挥手:服务器受到FIN返回确认标志ACK及确认序列号加1,表示我知道了。
第三次挥手:服务器发送一个FIN及序列号给客户端,表示结束数据传输。
第四次挥手:客户端发送确认位ACK报文,并返回确认序列号。
第二次及第三次挥手不放在一块的原因是当时可能有数据没传输完,不能立即做出应答,这就是问什么建立连接要三次握手,而断开连接却要四次挥手。