文章目录
一、什么是TCP
传输控制协议(TCP,Transmission Control Protocol)是在IP网络层之上用于提供端到端面向连接的、可靠的、基于字节流的传输层通信协议。
二、TCP/IP模型
相对于模型较为复杂的OSI,TCP/IP模型分为4 层分别为:应用层(OSI中的应用层、表示层、会话层的合并)、传输层、网络层、链路层(OSI中链路层、物理层的合并),两个模型之间对应关系如下图所示:
三、TCP/IP协议族
传输控制协议/因特网互联协议(Transmission Control Protocol/Internet Protocol)也称"国际协议簇",即不仅指 TCP/IP协议本身,而且包括与其有关的协议。是Internet最基本的协议、Internet国际互联网络的基础。
TCP/IP概念层模型 | 功能 | TCP/IP协议族 |
---|---|---|
应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
数据格式化,代码转换,数据加密 | 没有协议 | |
解除或建立与别的接点的联系 | 没有协议 | |
传输层 | 提供端对端的接口 | TCP,UDP |
网络层 | 为数据包选择路由 | IP,ICMP,RIP,OSPF,BCP,IGMP |
链路层 | 传输有地址的帧以及错误检测功能 | SLIP,CSLIP,PPP,APR,RARP,MTU |
以二进制数据形式在物流媒体上传输数据 | ISO2110,IEEE802,IEEE802.2 |
四、TCP/IP网络传输中的数据
TCP/IP协议作为互联网的基础通信架构,它是如何传输数据的?在4层层级结构中,每个分层在传递数据时候都会对来自上一层所要发送的数据附加一个首部,首部中包含了发送模板地址以及协议相关信息,然后传递到下一层,发送数据时在下一层级角度看,接收来自上一层的包都认为是本层的数据。而在接收数据时则是一层层解析剥离首部最终收到来自另一端的原数据。A用户发送信息到B用户历经1-8步骤,如下图所示:
五、TCP数据包结构
在4中我们清楚了TCP/IP网络中数据的传输过程,那对于数据是否会好奇是怎样的格式能解析出发送端地址、接收端地址,以及数据还有协议信息呢?接下来我们单独拎出传输层的信息来解析TCP首部
【源端口】:发送端端口,占16位,源端口与源IP地址作用标识报文返回地址
【目的端口】:接收端端口,占16位,标识具体接收报文的计算机应用过程序地址
【序号seq】:为当前端成功发送的数据位数,占4字节(32位),用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号
【确认号ack】:为当前端成功接收的数据位数+1,占4字节(32位),表示下一次应该收到的数据位置,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收
【头部长度】:表示TCP首部长度也叫数据偏移,占4位,指示何处数据开始
【保留位】:该字段主要是为了以后定义新的用途而保留,占6位,一般设置为0
【标志位】:占6位,从左到右共6个标志位,每个占1位,不同标志位表示的含义也不同,如下图所示:
标志位 | 含义 |
---|---|
URG | 紧急标志。紧急标志为"1"表明该位有效 |
ACK | 确认标志。表示确认号是否有效,值为1时有效 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走 |
RST | 发起重新建立连接标识 |
SYN | 请求建立连接,并在其序列号字段进行初始值设定,建立连接,设置为1 |
FIN | 断开连接标识。设置值1,即提示对端数据已经发送完毕,可以关闭连接 |
【窗口】:接收缓冲区的大小,TCP不允许发送超过此处所示大小的数据
【校验和】:发送端填充,CRC校验,接收校验不通过,则认为数据有问题。和UDP的区别是,UDP校验的是数据本身,TCP校验的不仅包含TCP首部,而且包含TCP数据部分
【紧急指针】:只有在URG为1时有效,该字段为1表示本报文的段中的紧急数据的指针
【选项填充】:指定了公认的段大小,时间戳,选项字段的末端,以及指定了选项字段的边界选项
六、TCP的3次握手与4次挥手
TCP提供面向有链接的通信传输,在数据通信之前需要先建立连接,这时需要客户端和服务器端发起3个包来确认连接的建立这一过程即三次握手,而在数据传输完成时需要关闭TCP连接,为了确保数据传输最终完成,断开时需要客户端和服务端总共发起4个包来确认连接的断开,即4次挥手。这一过程如下图所示:
6.1.三次握手
(1)第一次握手:客户端向服务端发起。发送数据包SYN=1,seq=1(随机序号),此时客户端的主动发起使得其状态由原先的关闭状态CLOSED进入SYN-SENT状态
(2)第二次握手:服务端向客户端发起。在接收请求前服务端一直处于LISTEN(监听)状态,接收请求后,发送数据包SYN=1,ACK=1,ack=i+1,seq=j(随机值)往客户端,其由原先的LISTEN进入SYN-RCVD状态
(3)第三次握手:客户端向服务端发起。客户端收到后检查确认ack,ACK值,正确后则发送数据包ACK=1,ack=j+1。当服务端确认后,则连接建立成功,此时客户端和服务端都进入ESTABLISHED状态
6.2.四次挥手
(1)第一次挥手:客户端向服务端发起。发送数据包FIN=1,ACK=1,seq=k(随机值),此时客户端进入FIN-WAIT-1(终止等待1)状态
(2)第二次挥手:服务端向客户端发起。发送数据包ACK=1,seq=u(随机值),ack=k+1,此时服务端进入CLOSE-WAIT(等待关闭)状态,客户端接收并确认ack值后进入FIN-WAIT-2(终止等待2)状态
(3)第三次挥手:服务端向客户端发起。在确认数据接收完毕后,用来发起关闭服务端向客户端的数据传送,发送数据包FIN=1,ACK=1,seq=v(随机值),ack=k+1,此时服务端进入LAST-ACK(最后确认)状态
(4)第四次挥手:客户端向服务端发起。在检验服务端发送的数据后,发送数据包ACK=1,seq=k+1,ack=v+1,此时客户端进入TIME-WAIT(时间等待)状态,此时TCP连接还未释放,必须经过2*MSL(最长报文段寿命/最长分节声明其,MSL阿是任何IP数据报能够在因特网中存活的最长时间,任何TCP实现都必须为MSL设定一个值。RFC1122[Braden 1989]的建议值为2分钟,不过院子Berkelcy的实现传统上改用30秒。这意味着TIME-WAIT状态的等待持续时间在1-4分钟之间)时间后,当主动发起关闭端(客户端)撤销相应的TCB后,才进入关闭状态。服务端在接收来自客户端的值后也进入了关闭状态。
6.3.观察端状态
在三次握手和四次挥手中,我们频繁的提到某个端进入了什么状态,听起来有点虚无缥缈,那接下来我们就在windows上来真实的查看下端口状态。通过以下命令可以查看到在机子上各个端口所处的状态:
netstat -ano
当然,TCP建立连接或者关闭连接的时间是非常迅速的我们无法实时观察到状态的变化,及时接下来我们换一个命令,以1秒的频率刷新状态但还是远远看不到状态的变化的。简单的命令只是为了证实或者亲眼看下都有哪几种状态存在。
netstat -np tcp 1 -ano | findstr 8009
6.4.WireShark抓包工具观察TCP连接的建立过程
常用的网络抓包工具有很多,如WireShark和tcpdump (linux上用),fiddler等,这里我们有wireshark来查看下连接建立的过程,在传输层协议中看一看到相关标志位的值得传送与变化
第1次握手
第2次握手
第3次握手
第1次挥手
第2次挥手
第3次挥手
第4次挥手
6.5.三次握手时序图
6.6.四次挥手时序图
6.7.总结
TCP连接的四次挥手在抓包时有时你是看不到4次包数据的,由于有时数据已经传送完毕服务端会将第二次与第三次挥手合并为一个包来发送。还有一个需要注意的点,以上所谓的客户端和服务端只是为了区分主动发起端和接收端,实际上服务端也可以向客户端发起连接,所以没有很具体的客户端或者服务端这种区分。此外挥手是任意一方都可以发起的,甚至可以双方都同时发起,以上的图例只是为了描述这一过程而用客户端向服务端发起来阐述。