TCP
头部
TCP 头部⽐ UDP 头部复杂的多
对于 TCP 头部来说,以下⼏个字段是很重要的。
- Sequence number ,这个序号保证了 TCP 传输的报⽂都是有序的,对端可以通过序号顺序的拼接报⽂。
- Acknowledgement Number ,这个序号表示数据接收端期望接收的下⼀个字节的编号是多少,同时也表示上⼀个序号的数据已经收到。
- Window Size ,窗⼝⼤⼩,表示还能接收多少字节的数据,⽤于流量控制。
标识符
URG=1
:该字段为⼀表示本数据报的数据部分包含紧急信息,是⼀个⾼优先级数据报⽂,此时紧急指针有效。紧急数据⼀定位于当前数据包数据部分的最前⾯,紧急指针标明了紧 急数据的尾部。ACK=1
:该字段为⼀表示确认号字段有效。此外,TCP
还规定在连接建⽴后传送的所有报⽂段都必须把ACK
置为⼀PSH=1
:该字段为⼀表示接收端应该⽴即将数据 push 给应 ⽤层,⽽不是等到缓冲区满后再提交。RST=1
:该字段为⼀表示当前 TCP 连接出现严重问题,可能需要重新建⽴ TCP 连接,也可以⽤于拒绝⾮法的报⽂段和拒绝连接请求。SYN=1
:当 SYN=1 , ACK=0 时,表示当前报⽂段是⼀个连接请求报⽂。当 SYN=1 ,ACK=1 时,表示当前报⽂段是⼀个同意建⽴连接的应答报⽂。FIN=1
:该字段为⼀表示此报⽂段是⼀个释放连接的请求报⽂。
状态机
HTTP
是⽆连接的,所以作为下层的 TCP
协议也是⽆连接的,虽然看似 TCP
将两端连接了起来,但是其实只是两端共同维护了⼀个状态
- TCP 的状态机是很复杂的,并且与建⽴断开连接时的握⼿息息相关,接下来就来详细描述下两种握⼿。
- 在这之前需要了解⼀个重要的性能指标 RTT。该指标表示发送端发送数据到接收到对端数据所需的往返时间
建⽴连接三次握⼿
- 在 TCP 协议中,主动发起请求的⼀端为客户端,被动连接的⼀端称为服务端。不管是客户端还是服务端, TCP 连接建⽴完后都能发送和接收数据,所以 TCP 也是⼀个全双⼯的协议。
- 起初,两端都为 CLOSED 状态。在通信开始前,双⽅都会创建 TCB 。 服务器创建完 TCB 后遍进⼊ LISTEN 状态,此时开始等待客户端发送数据。
第⼀次握⼿
- 客户端向服务端发送连接请求报⽂段。该报⽂段中包含⾃身的数据通讯初始序号。请求发送后,客户端便进⼊
SYN-SENT
状态,x 表示客户端的数据通信初始序号。
- 客户端向服务端发送连接请求报⽂段。该报⽂段中包含⾃身的数据通讯初始序号。请求发送后,客户端便进⼊
第⼆次握⼿
- 服务端收到连接请求报⽂段后,如果同意连接,则会发送⼀个应答,该应答中也会包含⾃身的数据通讯初始序号,发送完成后便进⼊
SYN-RECEIVED
状态。
- 服务端收到连接请求报⽂段后,如果同意连接,则会发送⼀个应答,该应答中也会包含⾃身的数据通讯初始序号,发送完成后便进⼊
第三次握⼿
- 当客户端收到连接同意的应答后,还要向服务端发送⼀个确认报⽂。客户端发完这个报⽂段后便进⼊
ESTABLISHED
状态,服务端收到这个应答后也进⼊ESTABLISHED
状态,此时连接建⽴成功。
- 当客户端收到连接同意的应答后,还要向服务端发送⼀个确认报⽂。客户端发完这个报⽂段后便进⼊
第三次握⼿可以包含数据,通过 TCP
快速打开( TFO
)技术。其实只要涉及到握⼿的协议,都可以使⽤类似 TFO
的⽅式,客户端和服务端存储相同 cookie
,下次握⼿
时发出 cookie
达到减少 RTT
的⽬的。
因为这是为了防⽌失效的连接请求报⽂段被服务端接收,从⽽产⽣错误。
可以想象如下场景。客户端发送了⼀个连接请求 A
,但是因为⽹络原因造成了超时,这时 TCP
会启动超时重传的机制再次发送⼀个连接请求 B
。此时请求顺
利到达服务端,服务端应答完就建⽴了请求。如果连接请求 A
在两端关闭后终于抵达了服务端,那么这时服务端会认为客户端⼜需要建⽴ TCP
连接,从⽽
应答了该请求并进⼊ ESTABLISHED
状态。此时客户端其实是 CLOSED
状态,那么就会导致服务端⼀直等待,造成资源的浪费。
🌰:在建⽴连接中,任意⼀端掉线,
TCP
都会重发 SYN
包,⼀般会重试五次,在建⽴连接中可能会遇到 SYN FLOOD
攻击。遇到这种情况你可以选择调低重试次数或者⼲脆在不能处理的情况下拒绝请求。
断开链接四次握⼿
TCP
是全双⼯的,在断开连接时两端都需要发送 FIN
和 ACK
。
- 第⼀次握⼿
若客户端 A
认为数据发送完成,则它需要向服务端 B
发送连接释放请求。
- 第⼆次握⼿
B
收到连接释放请求后,会告诉应⽤层要释放 TCP
链接。然后会发送 ACK
包,并进⼊ CLOSE_WAIT
状态,表示 A
到 B
的连接已经释放,不接收 A
发的
数据了。但是因为 TCP
连接时双向的,所以 B
仍旧可以发送数据给 A
。
- 第三次握⼿
B
如果此时还有没发完的数据会继续发送,完毕后会向 A
发送连接释放请求,然后 B
便进⼊ LAST-ACK
状态。
🌰:通过延迟确认的技术(通常有时间限制,否则对⽅会误认为需要重传),可以将第⼆次和第三次握⼿合并,延迟 ACK
包的发送。
- 第四次握⼿
A
收到释放请求后,向B
发送确认应答,此时A
进⼊TIME-WAIT
状态。该状态会持续2MSL
(最⼤段⽣存期,指报⽂段在⽹络中⽣存的时间,超时会被抛弃) 时间,若该时间 段内没有B
的重发请求的话,就进⼊CLOSED
状态。当B
收到确认应答后,也便进⼊CLOSED
状态。
为了保证 B
能收到 A
的确认应答。若 A
发完确认应答后直接进⼊ CLOSED
状态,如果确认应答因为⽹络问题⼀直没有到达,那么会造成 B
不能正常关闭。
TCP/IP
TCP/IP,传输控制协议/网际协议,是指能够在多个不同网络间实现信息传输的协议簇
TCP
(传输控制协议)- 一种面向连接的、可靠的、基于字节流的传输层通信协议
IP
(网际协议)- 用于封包交换数据网络的协议
TCP/IP
协议不仅仅指的是TCP
和IP
两个协议,而是指一个由FTP
、SMTP
、TCP
、UDP
、IP
等协议构成的协议簇,只是因为在TCP/IP
协议中TCP
协议和IP
协议最具代表性, 所以通称为TCP/IP
协议族(英语:TCP/IP Protocol Suite
,或TCP/IP Protocols
)。划分:
TCP/IP
协议族按层次分别了五层体系或者四层体系。- 五层体系的协议结构是综合了
OSI
和TCP/IP
优点的一种协议,包括应用层
、传输层
、网络层
、数据链路层
和物理层
。 - 五层协议的体系结构只是为介绍网络原理而设计的,实际应用还是
TCP/IP
四层体系结构,包括应用层
、传输层
、网络层(网际互联层)
、网络接口层
。
五层体系
应用层:
TCP/IP
模型将OSI
参考模型中的会话层、表示层和应用层的功能合并到一个应用层实现,通过不同的应用层协议为不同的应用提供服务 如:FTP
、Telnet
、DNS
、SMTP
等。
传输层:
- 该层对应于
OSI
参考模型的传输层,为上层实体提供源端到对端主机的通信功能传输层定义了两个主要协议:传输控制协议(TCP
)和用户数据报协议(UDP
), 其中面向连接的TCP
协议保证了数据的传输可靠性,面向无连接的UDP
协议能够实现数据包简单、快速地传输。
- 该层对应于
网络层
- 负责为分组网络中的不同主机提供通信服务,并通过选择合适的路由将数据传递到目标主机在发送数据时,网络层把运输层产生的报文段或用户数据封装成分组或包进行传送。
数据链路层
- 数据链路层在两个相邻节点传输数据时,将网络层交下来的
IP
数据报组装成帧,在两个相邻节点之间的链路上传送帧。
- 数据链路层在两个相邻节点传输数据时,将网络层交下来的
物理层
- 保数据可以在各种物理媒介上进行传输,为数据的传输提供可靠的环境。
四层体系
TCP/IP
的四层结构则如下表所示:
相同点:
OSI
参考模型与TCP/IP
参考模型都采用了层次结构。- 都能够提供面向连接和无连接两种通信服务机制。
不同点:
OSI
采用的七层模型;TCP/IP
是四层或五层结构。TCP/IP
参考模型没有对网络接口层进行细分,只是一些概念性的描述;OSI
参考模型对服务和协议做了明确的区分。OSI
参考模型虽然网络划分为七层,但实现起来较困难。TCP/IP
参考模型作为一种简化的分层结构是可以的。TCP/IP
协议去掉表示层和会话层的原因在于会话层、表示层、应用层都是在应用程序内部实现的,最终产出的是一个应用数据包, 而应用程序之间是几乎无法实现代码的抽象共享的,这也就造成OSI
设想中的应用程序维度的分层是无法实现的。