一、TCP协议基础
TCP是一种面向连接的(连接导向的)、可靠地、基于字节流的传输层通信协议。
1、TCP支持的服务类型
(1) FTP文件传送(File Transfer)
文件传送协议FTP允许用户从一台计算机到另一台计算机到另一台取得文件,或发送文件到另一台计算机。从安全性方面考虑,需要用户指定一个使用其他计算机的用户名和口令,一旦你要访问另一台系统中的文件,任何时刻都要运行FTP,而且只能拷贝到自己机器中才可以使用它。
(2) RLogin 远程登录(Remote Login)
网络终端协议Telnet允许用户登录到网络的中的任一计算机上。你可以启动一个远程进程连接到指定计算机。直到进程结束,期间你所键入的内容会被送到指定的计算机。值得注意的是,这时你实际上是与你的计算机进行对话。Telnet程序使得你的计算机在整个过程中不见了,所敲的每一个字符直接送到所登录的计算机系统。退出远程系统后,Telnet程序也就退出,你又与自己的计算机对话了
(3) SMTP POP3 电子邮件(Mail)
SMTP POP3允许你发送消息给其他计算机的用户。计算机邮件系统只需要你简单地往另一用户的邮件文件中添加信息、服务器Server是为网络上其他计算机提供指定服务的系统,客户机Client是得到这种服务的另外的计算机系统。
(4) NFS网络文件系统(Network File System)
接近于FTP。网络文件系统提供磁盘或设备服务,而无需特定的网络实用程序来访问另一系统的文件。可以简单地认为它是一个外加的磁盘驱动器。这种额外的“虚拟”磁盘驱动器就是其他计算机系统的磁盘。
(5)远程打印(Remote Printing)
(6) 远程执行(Remote Executing)
(7) 名字服务器(Name Servers)
(8)终端服务器(Ternimal Servers)
2、TCP段格式
TCP的段格式结构:
源端口:16bit源端口指的是发起通信的端口号。
目的端口:16bit目的端口指的是传输目的地的端口号。
序号:该序号是32bit的无符号数,到达2^32-1后又从0开始,表示在这个报文段中的第一个数据字节的编号。利用序号段可以纠正传输导致的乱序,从而重组分段报文。
确认序号(SIN):TCP使用32bit确认号标识下一个希望收到的报文的第一个字节的编号。因此,确认号应该是上一次成功接收到的数据字节号加1
首部长度:4bit,该字段以字为单位计量TCP头长度
保留:6bit恒为0
URG:紧急指针有效
ACK:确认序号有效
PSH:接收方应该尽快将这个报文交给应用层
RST:重置连接
SYN:同步序号,用来发起一个连接
FIN:发送端完成发送任务
窗口:该16bit字段表明接收端声明可以接收的TCP数据段大小,最大为65535字节
校验和:该16bit由发送端计算存储,由接收端进行验证。验证整个TCP,包括首部和数据
紧急指针:只有当URG置1时才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。通常用于发送紧急数据
选项:常见可选字段是最长报文大小
数据: TCP数据部分可选。建立和释放连接时,双方交换的只有TCP首部。
3、TCP通信
3.1 三次握手
在使用TCP进行通信时,首先需要建立连接。建立连接需要经过如下3次握手。
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
3.2 四次挥手
所谓四次挥手是指终止TCP连接时,需要客户端和服务器端总共发送4个包已确认连接的断开。整个流程如下:
这里假设客户端率先想要关闭连接
(1)对于客户端来说:
客户端想要终止TCP连接,于是发送一个带FIN标志的报文,之后客户端就开始等待服务器端的答复,自身转换为FIN_WAIT_1状态。在FIN_WAIT_1状态下收到对方回应的ACK报文即进入FIN_WAIT_2状态,而收到对方发来的FIN报文并回应ACK报文状态变更为TIME_WAIT状态,而假如FIN_WAIT_1状态下直接收到了对方同时带有FIN和ACK标志的报文时,就可以直接进入TIME_WAIT状态,而无需经过FIN_WAIT_1状态。
(2)对于服务器端来说:
对方close一个SOCKET后发送FIN报文给自己,服务器端会回应一个ACK交给对方,此时则进入CLOSE_WAIT状态,接下来,如果自己已经没有数据发送给对方,则会发送FIN报文给,此时状态变更为LACK_ACK,此状态是被动方在等待最后的对方的ACK报文,当收到ACK报文后就进入CLOSED状态。(正常情况下,主动方发送FIN报文后会先收到对方发来的ACK报文,但是特殊情况是发送FIN后并未接收到对方的ACK报文但却先接收到了对方的FIN报文,此时,进入CLOSING状态表示双方都在关闭SOCKET连接)
正常情况下的四次挥手
出现CLOSING状态情况