TCP六个标志位
在TCP协议报文的报头中存在一个用于标志TCP报文类型的标志位(不考虑保留标志位),这些标志位以比特位选项的方式存在,即对应标志位为0
则表示为假,对应标志位为1
则为真;
-
SYN
用于建立连接,连接发起方发送SYN请求,表示希望发起一个连接,同步序列号;
-
ACK
标识确认,该位被设置时,确认号字段有效,用于确认接收到的数据;
-
FIN
用于关闭连接,一方发送FIN表示它已经完成数据发送并希望关闭连接;
-
RST
用于重置连接,表示当前连接有问题,需要强制断开,通常用于错误或异常情况;
当
RST
报文被接收后需要重新进行三次握手来建立一个新的连接; -
PSH
推送数据,提示接收方应用程序应立即读取数据而不是在缓存中等待更多数据;
本质上TCP也是一种生产者消费者模型的体现,其中发送方的用户层与接收方上层的用户层各担任了生产者和消费者的身份,其中发送方的用户层作为生产者,接收方的用户层作为消费者,当接收缓冲区满了后发送方再向接收方发出的数据流将被丢弃,在对于流量控制而言本质上就是在网络中的一种同步应用;
而
PSH
报文可以通过告诉接收方应尽快将这些数据流传给应用层避免数据长时间积累在接收缓冲区中导致接收方的接收缓冲区被写满; -
URG
表示紧急数据,紧急指针字段有效,用于标示紧急数据的位置,提示接收方优先处理;
在操作系统中存在一个专门用于处理紧急数据的空间,当紧急数据被发送过后且
URG
标志位被设置,表示紧急指针有效,对应的紧急数据将会优先被处理;对于TCP而言,其数据流是按序到达的,所以为了不导致大面积的数据乱序,紧急指针所指向的紧急数据很小,通常只有一个字节;
大部分情况下紧急数据用来处理或者检查对端接收缓冲区中数据长时间不被处理导致的发送方所发送的数据无法被接收方接收导致发送方未接收到应答等情况;
可以将
URG
标志位理解为一个优先通道;可以通过系统调用接口
send()
设置对应的MSG_OOB
选项来设置紧急数据,对应的也可通过系统调用接口recv()
同样设置MSG_OOB
选项来读取对应的紧急数据;
六个标志位中每一个标志位都标示着该TCP报文的类型,即一个TCP报文可能是多种类型,如在进行三次握手时,被握手方需要返回一个SYN+ACK
的报文,其中该报文中的SYN
表示也需要向对方建立起连接,而ACK
表示的是对对方发起的SYN
报文进行应答;
同时为了保证安全性,操作系统通常不会直接让用户直接修改对应的标志位,但对应的操作系统会为用户提供一些系统调用接口来间接修改报文的属性类型;
如当用户调用connect()
系统调用接口向一个服务端发起连接时,本质上是让系统构建一个SYN
类型的TCP报文并发送给对端;
对应的当一个已经连接的服务端或是客户端调用close()
时本质上也是让系统在底层构建一个FIN
类型的报文,并发送给对方表示希望断开该次连接;
TCP的连接
TCP是一个保证可靠传输的网络协议,其为了保证数据传输的可靠性,通常要与服务端建立起连接,但尽管TCP协议制定了若干的约定来保证数据在传输中的可靠性但也避免不了一些不可抗拒的因素;
本质上TCP协议保证可靠传输的前提是在与对端建立连接的前提下,保证未发生不可抗力异常时数据的传输(不可抗力异常通常为断电或设备故障,物理连接中断或是网络设备配置错误,任何一端应用层的崩溃等情况);
通常情况下服务器都是一对多的,即一台服务器将对应存在若干个客户端,当一台客户端向服务器发起连接请求时服务器中可能也在处理来自其他客户端的连接请求或是维护与其他客户端的连接,维护的方式同样的采用的是 “先描述后组织” ,无论是服务端还是客户端为保证连接的可靠性系统层面都要对已经建立好的连接创建一个对应的结构体,通过实例化结构体对象再以特定的数据结构将多个该结构体对象组织在一起,如链表;