文章目录
- 前言
- TCP报文首部
- TCP数据传输
- 3次握手
- 4次断开
前言
TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
TCP报文首部
源端口和目的端口
各占2个字节,分别写入源端口和目的端口;
序号
占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始;
确认号
占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据;
数据偏移
占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远;
保留
占6位,保留今后使用,但目前应都位0;
紧急URG
当URG=1,表明紧急指针字段有效。告诉系统此报文段中有紧急数据;
确认ACK
仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
推送PSH
当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1;
复位RST
当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
同步SYN
在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
终止FIN
用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
窗口
占2字节,指的是通知接收方,发送本报文你需要有多大的空间来接受;
检验和
占2字节,校验首部和数据这两部分;
紧急指针
占2字节,指出本报文段中的紧急数据的字节数;
选项
长度可变,定义一些其他的可选的参数。
TCP数据传输
TCP/IP协议是Internet最基本的协议,其中应用层的主要协议有Telnet、FTP、SMTP等,是用来接收来自传输层的数据或者按不同应用要求与方式将数据传输至传输层;传输层的主要协议有UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通道,可以实现数据传输与数据共享;网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等;而网络访问层,也叫网络接口层或数据链路层,主要协议有ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问题进行有效处理等。
3次握手
TCP 三次握手建立连接,是 TCP 数据传输的必要过程。流程大致分为以下几步:
刚开始,客户端(Client)和服务器(Server)都处于 CLOSED 状态;
服务端创建传输控制块(TCB),时刻准备客户进程的连接请求,处于 LISTEN 监听状态;
第一次握手:客户端将 TCP 报文的标志位 SYN 置为1,随机产生一个序号值 seq=x 保存在 TCP 首部的序列号字段里,然后指明客户端打算连接的服务器端口,并将数据包发送给服务器端。发送完毕后,客户端进入 SYN-SEND 状态;
第二次握手:服务端收到数据包后,由标志位 SYN=1 确认了客户端要请求建立连接。于是,服务端将 TCP 报文的标志位 SYN 和确认应答号 ACK 都置为 1,请求号 ack = x+1(表示序列号为 x 的消息已经接收了,下一次传输的序列号为 x+1),再随机产生一个序号值 seq=y,然后将该数据包发送给客户端以确认连接请求。这时,服务端进入 SYN-RCVD 状态;
第三次握手:客户端收到服务端的确认后,检查 ack 是否为 x+1,ACK 是否为1,如果正确则将确认应答 ACK 置为 1,请求号 ack=y+1(表示序列号为 y 的消息已经接收了,下一次传输的序列号为 y+1),并将数据包发送给服务器。服务器端检查 ack 是否为 y+1,ACK 是否为 1,如果正确则成功建立连接。客服端和服务器都进入 ESTABLISHED 状态,三次握手结束,客户端和服务器可以开始传输数据了。
3次握手比喻:
- Client: 你好,吃了吗?
- Server: 吃了。你吃了吗?
- Client: 吃了,还很撑!
4次断开
当客户端(Client,以下简称C端)和服务器(Server,以下简称S端)都是连接状态时:
第一次挥手:C 端不想再进行数据传输了,就发起一条挥手请求,将 TCP 报文的标志位 FIN=1,设置序列号 seq 为随机数 x。此时,C 端进入 FIN_WAIT_1 状态;
第二次挥手:S 端收到 C 端的 FIN 数据报,知道 C 端不再发送数据了。于是返回一条 ACK 确认消息,表示同意 C 端的关闭请求,然后 S 端进入 CLOSE_WAIT 状态。当 C 端收到 S 端的确认消息后,进入 FIN_WAIT_2 状态,等待 S 端的连接结束;
第三次挥手:S 端发送数据完毕后,给 C 端发送标志位为 FIN 的报文段,请求关闭连接,并进入 LAST_ACK 状态;
第四次挥手:当 C 端收到 FIN 报文段之后,再向 S 端回复标志位为 ACK 的应答消息,然后进入 TIME_WAIT 状态,当等待 2MSL(报文的最大存活时间,后面会详细讲解) 后还没收到回复,证明 S 端已经正常关闭,于是 C 端进入CLOSED 状态。而 S 端在收到 C 端的 ACK 报文段以后,就关闭连接,直接进入 CLOSED 状态。
4次挥手比喻:
- Client: 分手!
- Server: 分就分,等等,我把账算完。
- Server: 账算完了,后会无期。
- Client: 后会无期!