动手学习TCP:总结和索引

TCP是一个十分复杂的协议,经过前面几篇文章只涉及了TCP协议中一些基本的概念。html

虽说都是一些TCP最基本的概念,可是试验过程当中一直在踩坑,例如:TCP flag设置错误,seq、ack号没有计算正确,TCP状态变迁错误等等。算法

经过Pcap.Net真正实验一下才发现了不少TCP协议中要注意的细节,例如:Ack、Seq号的计算,EthernetLayer、IpV4Layer 、TcpLayer的层层包装,不一样TCP flags的含义等等。服务器

TCP中还有不少重要的内容,先作个记录,后面再深刻了解。网络

  • 往返时间测量
  • 滑动窗口
  • 拥塞避免算法
    • 慢启动
    • 快速重传和快速恢复算法

文章索引

动手学习TCP: 环境搭建学习

动手学习TCP:TCP链接创建与终止spa

动手学习TCP:客户端状态变迁server

动手学习TCP:服务端状态变迁htm

动手学习TCP:TCP特殊状态blog

动手学习TCP:数据传输索引

动手学习TCP:4种定时器

简单总结

下面就对前面几篇文章中涉及到的TCP知识的进行简单的汇总。

TCP首部

  

  • 在TCP首部中没有源和目标的IP、MAC地址(IP和MAC地址分别是网络层和链路层首部的信息),只有源和目标的端口
  • Sequence Number是包的序号,网络层(IP层)的传输是不可靠的,可能产生包乱序,因此这个须要能够解决网络包乱序的问题
  • Acknowledgement Number用来确认收到数据包的确认序号,为TCP的传输提供了可靠性保证
  • TCP Flags包括了8个bit,经过对这些bit的设置,能够表明不一样类型的TCP数据包

 

 

TCP链接创建和终止

三次握手

  • 链接创建发起端发送[SYN]包,该端将主动打开(active open)
  • 接收端将发送[SYN, ACK]包,该端将被动打开(passive open),ACK标志表示对收到的[SYN]包的确认
  • 链接创建发起端发送[ACK]包确认[SYN, ACK]包

四次挥手

  • 链接终止端(client)发送[FIN, ACK] 包,关闭client到server方向的数据发送通路
  • server端发送[ACK]包来确认来自client的[FIN, ACK] 包
  • server端发送[FIN, ACK] 包,关闭server到client方向的数据发送通路
  • client端发送[ACK]包来确认来自server的[FIN, ACK] 包,到此TCP链接关闭

 

 

TCP状态机

网络上的传输是没有链接的,包括TCP也是同样的。TCP所谓的"链接",实际上是在通信的双方维护一个"链接状态",让它看上去好像有链接同样。

TCP状态机的所有11种状态中:

  • 客户端特有的状态:SYN_SENT、FIN_WAIT_一、FIN_WAIT_二、CLOSING、TIME_WAIT 。
  • 服务端特有的状态:LISTEN、SYN_RCVD、CLOSE_WAIT、LAST_ACK 。
  • 共有的状态:CLOSED、ESTABLISHED

 

 

客户端状态变迁

From State

To State

Recv Packet

Send Packet

CLOSED

SYN_SENT

-

[SYN]

SYN_SENT

ESTABLISHED

[SYN, ACK]

[ACK]

ESTABLISHED

FIN_WAIT_1

-

[FIN, ACK]

FIN_WAIT_1

FIN_WAIT_2

[ACK]

-

FIN_WAIT_2

TIME_WAIT

[FIN, ACK]

[ACK]

TIME_WAIT

CLOSED

-

-

 

 

服务器状态变迁

From State

To State

Recv Packet

Send Packet

CLOSED

LISTEN

-

-

LISTEN

SYN_RCVD

[SYN]

[SYN, ACK]

SYN_RCVD

ESTABLISHED

[ACK]

-

ESTABLISHED

CLOSE_WAIT

[FIN, ACK]

[ACK]

CLOSE_WAIT

LAST_ACK

-

[FIN, ACK]

LAST_ACK

CLOSED

[ACK]

-

 

 

链接创建超时和SYN_RCVD

当服务端收到客户端的TCP链接请求后,会发送[SYN, ACK]包,进入SYN_RCVD状态。若是没有收到客户端的确认,服务器会尝试重传,并保持SYN_RCVD状态一段时间(一般是30秒到2分钟)。

因为服务端的SYN_RCVD状态,就有了SYN Flood攻击。所谓的SYN Flood攻击就是,恶意的客户端给服务端发了一个SYN后,就下线了,经过这种方式来消耗服务器资源。

 

 

TIME_WAIT和2MSL

TIME_WAIT状态也称为2MSL(Maximum Segment Lifetime)等待状态,当TCP的一端进入TIME_WAIT状态后,所产生的效果就是该端口在2MSL这段时间中不能被再次使用。

 

 

复位报文段

TCP首部的RST位是用于复位的。通常不管合适一个报文端发往相关的链接出现错误,TCP都会发出一个复位报文段。主要使用:

  • 访问不存在的端口的链接请求
  • 异常终止一个链接

 

 

最大报文段长度MSS

最大报文段长度表示TCP传往另外一端的最大块数据的长度。当一个链接创建时,链接的双方都要通告各自的MSS。

通常,若是没有分段发生,MSS仍是越大越好。报文段越大容许每一个报文段传送的数据越多,相对IP和TCP首部有更高的网络利用率。当TCP发送一个SYN时,它能将MSS值设置为外出接口的MTU长度减去IP首部和TCP首部长度。对于以太网,MSS值可达1460。若是目的地址为非本地的,MSS值一般默认为536,是否本地主要经过网络号区分。

 

 

MTU

以太网和802.3对数据帧的长度都有一个限制,最大值分别是1500和1492个字节。链路层的这个指标称做MTU(注意MTU是链路层的概念),不一样类型的网络大多数都有一个上限。

若是网络层(IP层)有一个数据报须要传输,且数据的长度比链路层的 MTU还大,那么网络层(IP层)就要进行分片(fragmentation),把数据报分红若干片,保证每个分片都小于MTU;目的端的网络层(IP层)会对收到的分片进行从新组装。

 

 

TCP的半关闭

TCP提供了链接的一端在结束它的发送后还能接收来自另外一端数据的能力,这就是TCP的半关闭。

客户端发送FIN,另外一端发送对这个FIN的ACK报文段。当收到半关闭的一端在完成它的数据传送后,才发送FIN关闭这个方向的链接,客户端再对这个FIN确认,这个链接才完全关闭。

 

 

对于每一个TCP链接,TCP管理4个不一样的定时器

  • 重传定时器使用于当但愿收到另外一端的确认。
  • 坚持定时器(persist)使窗口大小信息保持不断流动,即便另外一端关闭了其接收窗口。
  • 保活定时器(keepalive)可检测到一个空闲链接的另外一端什么时候崩溃或重启。
  • 2MSL定时器测量一个链接处于TIME_WAIT状态的时间。

 

 

TCP keepalive和HTTP HTTP Keep-Alive

  • HTTP协议的Keep-Alive意图在于链接复用,防止过多频繁的端链接形成TCP链接资源浪费
  • TCP的keepalive机制在于保活、心跳,检测链接错误
相关文章
相关标签/搜索