一、TCP数据被封装在一个IP数据包里。
二、TCP报文格式
1.16位源/目的端口号
每一个TCP段都包含源端口号和目的端口号:用于寻找发送端和接收端应用进程。源端口号、目的端口号加上IP数据包首部的源IP地址、目的IP地址,共同确定唯一的一个TCP连接。
2.32位序号
序号用来表示从TCP发送端向TCP接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。序号是32bit的无符号数,达到2^32-1后又从0开始。序号字段包含由这个主机选择的该连接的初始序号ISN。该主机要发送数据的第一个字节序号为ISN加1,因为SYN标志消耗了一个序号。
3.32位确认序号
目的端所期望收到的下一个序号,应是上一次成功收到数据字节序号+1。例如,第一次发送端发送1024字节,那么接收端接收到1024字节,期待第1025个字节,则确认序号应为1025。
4.SYN
当建立一个新的连接时,SYN标志变为1.
5.ACK
ACK设置为1时,确认序号有效,发送端接收到确认序号,则继续发送接下来的报文段。
例如发送端发送的1-1024字节的报文段后。
接收端确认接收到1024个字节的保温段,则返回一个确认序号为1025的ACK。
若发送端接收到,则继续发送1025-2048字节的报文段。
若接收端收到1025-2048字段的报文段,则返回一个确认序号为2049的ACK,若未能成功接收或检验和错误,则从新发送确认序号为1025的ACK,要求发送端重新发送1025-2048字节的报文段。
三、TCP三次握手
1.建立连接。发送端发送连接请求报文段,SYN=1,Squence Number(数据包序号)(seq)为x,接下来等待接收端确认,发送端进入SYN_SENT状态(请求连接);
2.接收端收到发送端的 SYN 报文段,对 SYN 报文段进行确认,设置 ACK为 x+1(即seq+1 ; 同时自己还要发送 SYN 请求信息,将 SYN 设置为1, seq为 y。接收端将上述所有信息放到 SYN+ACK 报文段中,一并返还给发送端,此时接收端进入 SYN_RECV状态。(SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。)
3.发送端收到接收端返还的 SYN+ACK(确认符) 报文段;然后将 ACK 设置为 y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(连接成功)状态,完成TCP 的三次握手。
四、TCP四次挥手
1.发送端设置seq和 ACK ,向接收端发送一个 FIN(终结)报文段。此时,发送端进入 FIN_WAIT_1 状态,表示发送端没有数据要发送给接收端了。
2.接收端收到了发送端发送的 FIN 报文段,向发送端回了一个 ACK 报文段。
3.接收端向发送端发送FIN 报文段,请求关闭连接,同时接收端进入 LAST_ACK 状态。
4.发送端收到接收端发送的 FIN 报文段后,向接收端发送 ACK 报文段,然后发送端进入 TIME_WAIT 状态。
接收端收到发送端的 ACK 报文段以后,就关闭连接。
此时,发送端等待 2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明接收端已经正常关闭,这样发送端就可以关闭连接了。
参考内容:
TCP-IP详解卷1:协议
一文搞懂什么是TCP/IP协议