大纲

一、IP Header

二、TCP Header

三、三次握手过程

四、四次挥手过程

五、TCP Finite State Machine




一、IP Header

TCP/IP协议之三次握手与四次挥手_三次握手

  • IP version:协议版本号,IP报文首部的第一个字段是4位版本字段。对IPv4来说,这个字段的值是4。

  • Header Length第二个字段是4位首部长度,说明首部有多少32位字长。由于IPv4首部可能包含数目不定的选项,这个字段也用来确定数据的偏移。这个字段的最小值是5,最大值是15。

  • Type of Service最初被定义为服务类型字段,但被RFC 2474重定义为DiffServ。新的需要实时数据流的技术会应用这个字段,一个例子是VoIP。

  • Total Length:IP包总长度,这个16位字段定义了报文总长,包含首部和数据,单位为字节。这个字段的最小值是20(20字节首部+0字节数据),最大值是65535。所有主机都必须支持最小576字节的报文,但大多数现代主机支持更大的报文。有时候子网会限制报文的大小,这时报文就必须被分片。

  • Identification:标识符,这个字段主要被用来唯一地标识一个报文的所有分片。一些实验性的工作建议将此字段用于其它目的,例如增加报文跟踪信息以协助探测伪造的源地址。

    标志:这个3位字段用于控制和识别分片,它们是

    位0:保留,必须为0

    位1:禁止分片(DF)

    位2:更多分片(MF)

    如果DF标志被设置但路由要求必须分片报文,此报文会被丢弃。这个标志可被用于     发往没有能力组装分片的主机。

    当一个报文被分片,除了最后一片外的所有分片都设置MF标志。不被分片的报文不      被设置MF标志:它是它自己的最后一片。

  • Fragment Offset:分片偏移,这个13位字段指明了每个分片相对于原始报文开头的偏移量,以8字节作单位。TTL:存活时间,这个8位字段避免报文在互联网中永远存在(例如陷入路由环路)。存活时间以秒为单位,但小于一秒的时间均向上取整到一秒。在现实中,这实际上成了一个跳数计数器:报文经过的每个路由器都将此字段减一,当此字段等于0时,报文不再向下一跳传送并被丢弃。常规地,一份ICMP报文被发回报文发送端说明其发送的报文已被丢弃。这也是traceroute的核心原理。

  • Protocol:协议,这个字段定义了该报文数据区使用的协议。IANA维护着一份协议列表(最初由RFC 790定义)。

  • Header Checksum:首部检验和,这个16位检验和字段用于对首部查错。在每一跳,计算出的首部检验和必须与此字段进行比对,如果不一致,此报文被丢弃。值得注意的是,数据区的错误留待上层协议处理——用户数据报协议和传输控制协议都有检验和字段。因为生存时间字段在每一跳都会发生变化,意味着检验和必须被重新计算,RFC 1071这样定义计算检验和的方法:The checksum field is the 16-bit one's complement of the one's complement sum of all 16-bit words in the header. For purposes of computing the checksum, the value of the checksum field is zero.Source IP 

  • Address:源地址,一个IPv4地址由四个字节共32位构成,此字段的值是将每个字节转为二进制并拼在一起所得到的32位值,例如,10.9.8.7是00001010000010010000100000000111。这个地址是报文的发送端。但请注意,因为NAT的存在,这个地址并不总是报文的真实发送端,因此发往此地址的报文会被送往NAT设备,并由它被翻译为真实的地址。

  • Destination IP Address:目的地址,与源地址格式相同,但指出报文的接收端。

  • Options:选项附加的首部字段可能跟在目的地址之后,但这并不被经常使用。请注意首部长度字段必须包括足够的32位字来放下所有的选项(包括任何必须的填充以使首部长度能够被32位整除)。当选项列表的结尾不是首部的结尾时,EOL(选项列表结束,0x00)选项被插入列表末尾。下表列出了可能的选项

  • Data:数据字段不是首部的一部分,因此并不被包含在检验和中。数据的格式在协议首部字段中被指明,并可以是任意的传输层协议





二、TCP Header

TCP/IP协议之三次握手与四次挥手_三次握手_02


  • Source Port Number:来源连接端口(16位长),辨识发送连接端口

  • Destination Port Number:目的连接端口(16位长),辨识接收连接端口

  • Sequence Number:序列号(seq,32位长)

  • Acknowledgement Number:确认号(ack,32位长),期望收到的数据的开始序列号。也即已经收到的数据的字节长度加1。如果含有同步化旗标(SYN),则此为最初的序列号;第一个数据比特的序列码为本序列号加一。如果没有同步化旗标(SYN),则此为第一个数据比特的序列码。

  • Header Length:报头长度,以4字节为单位计算出的数据段开始地址的偏移值。

  • Reserved:保留,须置0

  • 标志符

    URG:为1表示高优先级数据包,紧急指针字段有效。

    ACK:为1表示确认号字段有效

    PSH:为1表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。

    RST:为1表示出现严重差错。可能需要重现创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求。

    SYN:为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步

    FIN:为1表示发送方没有数据要传输了,要求释放连接。

  • Windows Size:窗口大小,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。用于流量控制。

  • TCP Checksum:校验和,对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。这是一个强制性的字段。

  • Urgent Pointer:紧急指针,本报文段中的紧急数据的最后一个字节的序号。

  • Options:选项字段 —最多40字节。每个选项的开始是1字节的kind字段,说明选项的类型。

    0:选项表结束(1字节)

    1:无操作(1字节)用于选项字段之间的字边界对齐。

    2:最大报文段长度(4字节,Maximum Segment Size,MSS)通常在创建连接而设置SYN标志的数据包中指明这个选项,指明本端所能接收的最大长度的报文段。通常将MSS设置为(MTU-40)字节,携带TCP报文段的IP数据报的长度就不会超过MTU,从而避免本机发生IP分片。只能出现在同步报文段中,否则将被忽略。

    3:窗口扩大因子(4字节,wscale),取值0-14。用来把TCP的窗口的值左移的位数。只能出现在同步报文段中,否则将被忽略。这是因为现在的TCP接收数据缓冲区(接收窗口)的长度通常大于65535字节。

    4:sackOK —发送端支持并同意使用SACK选项。

    5:SACK实际工作的选项。

    8:时间戳(10字节,TCP Timestamps Option,TSopt)

        发送端的时间戳(Timestamp Value field,TSval,4字节)

        时间戳回显应答(Timestamp Echo Reply field,TSecr,4字节)



三、三次握手过程

TCP/IP协议之三次握手与四次挥手_三次握手_03




三次握手过程详解:

  • 第一次握手:客户端向服务器端发送连接请求包,标志位SYN(同步序号)置为1,产生序列号为X=0

  • 第二次握手:服务器端收到客户端发过来报文,由SYN=1知道客户端要求建立联机。于是向客户端发送一个SYN和ACK都置为1的TCP报文,设置自己的初始序列号Y=0,将确认序号(ACK)设置为客户端的序列号加1,即X+1 = 0+1=1

  • 第三次握手:客户端收到服务器发来的包后检查确认序号(ACK)是否正确,即第一次发送的序号加1(X+1=1)。以及标志位ACK是否为1。若正确,服务器再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(ACK)=Y+1=0+1=1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了


四、四次挥手过程

TCP/IP协议之三次握手与四次挥手_TCP/IP_04

四次挥手过程详解:

  • ①第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X=1,确认序列号为Z=1

  • ②服务器收到FIN之后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即X=X+1=2。序号为收到的确认序号=Z

  • ③服务器关闭与客户端的连接,发送一个FIN。标志位FIN和ACK置为1,序号为Y=1,确认序号为X=2

  • 客户端收到服务器端发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=2。序号为收到的确认序号X=2


ps:四次握手用来关闭已建立的TCP连接。有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送。由于RST包不是TCP连接中的必须部分,可以只发送RST包(即不带ACK标记)。


五、TCP有限状态机


TCP/IP协议之三次握手与四次挥手_三次握手_05



  • CLOSED(Client):呈阻塞、关闭状态,表示主机当前没有活动的传输连接或正在进行传输连接


  • LISTEN(Server):呈监听状态,表示服务器正在等待新的传输连接进入


  • SYN_SENT(Client):表示主机已经发出一个传输连接请求,等待对方确认


  • SYN_RCVD(Server):表示主机已收到一个传输连接请求,但尚未确认


  • ESTABLISHED(Client,Server):传输连接建立,通信双方进入正常数据传输状态


  • FIN WAIT 1(Client):(主动关闭)主机已经发送关闭连接请求,等待对方确认


  • CLOSE WAIT(Server):(被动关闭)收到对方发来的关闭传输连接请求,并已确认


  • FIN WAIT 2(Client):(主动关闭)主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求


  • LAST ACK(Server):(被动关闭)等待最后一个关闭传输连接确认,并等待所有分组消失


  • TIME_WAIT(Client):完成双向传输连接关闭,等待所有分组消失


  • CLOSING(Server):双方同时尝试关闭传输连接,等待对方确认