基础知识
具体含义
利用IP进行通信时所必须用到的协议的统称。 具体来说,IP 或 ICMP、TCP或 UDP、 TELNET或是 FTP、HTTP 等都属于 TCP/IP 的协议。它们与 TCP或 IP 的关系紧密,是互联网必不可以少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称TCP/IP为国际协议族。
TCP头部信息
注: 指定通信的源端口号、目的端端口号、管理 TCP连接, 控制两个方向的数据流
TCP报文各个位置详解
源端口号:数据发起者的端口号,16bit
目的端口号:数据接收者的端口号,16bit
序号:32bit的序列号,由发送方使用
确认序号:32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1
(数据偏移)首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。
保留:6bit,均为0
紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送;
确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包;
推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程;
复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接;
同步比特SYN:在建立连接时用来同步的序号。SYN=1,ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。
终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。
窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。
校验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。
紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。
选项:长度可变,最长可达40字节。
wireshark 捕获到的TCP包的每个字段 如下图所示:
TCP 三次握手
tcp 建立连接时会有三次握手,如下图所示,抓包获取到了三次握手的三个数据包,第四个包才是 http(应用数据包)。
TCP三次握手流程图
TCP 四次挥手
TCP断开连接时,会有四次断开过程,如下图所示,wireshark截获到了四次断开的四个数据包。
TCP四次挥手流程图
TCP特点及其目的
为了通过IP数据报实现可靠性传输,需要考虑很多事情,例如数据的破坏、丢包、重复以及分片顺序混乱等问题。如不能解决这些问题,也就无从谈起可靠传输。
TCP 通过 检验和、序列号、确认应答、重发控制、连接管理 以及 窗口控制 等机制实现可靠性传输。
疑问
为什么 TIME_WAIT 状态需要2倍的MSL(Maximum segment lifetime)长度?
- To implement TCP’s full-duplex connection termination reliably
如 tcp四次挥手图如示,如果客户端发送的最后一个 ACK 丢掉了,那么服务端就会 restransmit the FIN. 为了接受这个超时和 retransmitted FIN, 客户端需要 TIME_WAIT 的状态;
但为什么TIME_WAIT
的状态需要保持2MSL的时长呢,实际上这取决于服务器端FIN超时重传时间RTO
(retransmission timeout), 一般情况下, RTO 会小于 MSL, 但是考虑掉最坏的情况,
RTO is 2MSL, 所以 TIME_WAIT
的状态是2MSL是为了确保最坏情况下可以接收随时间重传的FIN。
- To allow old duplicate segments to expire in the network
确保在这个连接中产生的数据可以从网络中消失。这里的某些人可能会有一个问题:客户端回复最后一个ACK后,感觉所有数据包都可以通过一个MSL消失。 为什么所有数据包都需要2MSL才能确保消失呢? 原因是:
假设客户端在一个MSL时间后立即发送ACK,并且服务器在接收到ACK之前随时间开始重新传输FIN,因此如果FIN消失,则需要2MSL。
注: 虽然是解释,但仍未触及至根本的原因, 需要继续探究