每天五分钟带你精通tcp/ip网络(8)TCP
TCP介绍
尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务
在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。TCP协议在RFC793有明确的规范
TCP通过下列方式来提供可靠性:
- 应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段( segment)。
- 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。
- TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
- 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
- 既然IP数据报会发生重复, TCP的接收端必须丢弃重复的数据。
- TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。也即是常说的反压。
两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务。TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。
TCP报文格式
|
|
-
Source Port & Destination Port : 源目的端口(同UDP)
-
Sequence Number & Acknowledgment Number : 序列号和确认序列号,序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节,每个传输的字节都被计数。举例来说:TCP报文被称为一个TCP SEGMENT,也就是一个段,比如这个段的长度是100,而初始序列号是0。当对端收到这个段后,会发送一个ACK报文,ACK的号就是101,当发送端收到这个ACK后,他就知道了,下一个报文段从第101个字节开始发送。也就是对已发送的字节进行计数。
-
DataOffset: 首部32bit word的数量,也即TCP首部,最多15(1111)* 4 = 60字节
-
Control Bits: 6 bits (from left to right):
- URG: 紧急指针有效
- ACK: 确认序号有效
- PSH: 接收发应尽快将该报文交给应用层
- RST: 重新连接
- SYN: 同步序号用来发起一个连接
- FIN: 发端完成发送任务
-
Window: TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节 CheckSum: 检验和覆盖了整个的TCP报文段(TCP首部和TCP数据)。这是一个强制性的字段
-
Option:
Kind Length Meaning
0 - End of option list. 1 - No-Operation. 2 4 Maximum Segment Size.
通过wireshark抓包:
编辑
TCP连接的建立与关闭
连接建立过程:
- 请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为100)。
- 服务器发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
- 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。
这个过程也称为三次握手(three-way handshake)
|
|
连接正常关闭过程:
建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。收到一个FIN只意味着在这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的。
|
|
2MSL:TIME-WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。对一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIMEWAIT状态停留的时间为2倍的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。
平静时间:TCP在重启动后的MSL秒内不能建立任何连接。这就称为平静时间(quiet time)。
同时打开
TCP是特意设计为了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接
同时关闭
同时关闭与正常关闭使用的段交换数目相同
TCP状态变迁
TCP设计了一套非常复杂的状态机来保证协议的正常运转,如下TCP状态变迁图,状态的变迁是依赖收到的报文进行驱动的的。
TCP服务器设计与实现
|
|
|
|