TCP: Transmission Control Protocol 传输控制协议
作用:实现服务端和客户端之间可靠的通信连接 可靠通信的基础:在正常进行客户端和服务端之间的通信之前会通过数据报文进行双方的身份验证
TCP/UDP的区别
TCP:就好比打电话,只有知道对方的身份和手机号码,我们才愿意给对方打电话,如果打不通会再次尝试拨打几次
UDP:用户数据报:就好比广播,不需要知道对方的手机号码和身份,只要通过广播将信息播出,不管对方有没有听到都不管了(可靠性不高的场景)
名词解释
信号指令:1 表示有效 0表示无效
- ACK:报文确认号
- SYN:同步信号
- FIN:终止信号
ack:数据包确认序列号:接受数据包序号+1
seq:数据包序列号(连续发送的数据包序列号不一定是连续的)
例如:TCP挥手的过程服务端发送的第1次确认接受报文不需要客户端进行响应,服务端再次发送数据包的序号是随机的)
三次握手
客户端和服务端建立可靠通信的前期准备工作
三次握手原理图
三次挥手过程(3个数据包)
- 客户端发送SYN=1 seq=X的请求报文给服务端:SYN-SENT:同步已发送状态
- 服务端确认客户端报文,响应报文:SYN=1 ACK=1 ack=x+1,seq=Y:SYN_RCVD:同步收到
- 客户端收到服务端报文,响应:ACK=1,seq=x+1,ack=Y+1:ESTABLISHED(连接建立)
seq、ack作用: 主要是为了确保客户端/服务端之间的数据报文发送属于同一个通信连接过程的范围内,实现双方的身份确认
例如: A向B发送请求报文,A的数据包序列号001,一般如果A再次发送数据报文,则下面一个数据包的序列号002,B收到A的请求报文,可以确认A发送的数据包序号为001,那B也会知道A发送的下一个数据包的序号为002,因此B将A下一个数据包的报文序列号存入ack中,ack = 001 + 1 = 002, 同时B也会生成自己的响应数据包的序列号110,A接收到B的响应报文,读取ack的值如果和A之前发送的数据包的序列号+1,那说明B是对A之前发送的报文进行响应的,从而实现A对B通信确认,同时A也会读取响应报文中的seq字段,并且进行+1操作,存入ack=110+1=111,B接收到A的报文之后,读取ack的值,与之前发送的报文序列号+1一致,从而实现B对A的通信确认,经过A对B和B对A的数据包身份确认,双方就可以建立正式的通信连接。
四次挥手:释放双方通信连接的过程
四次挥手原理图
四次挥手过程(4个数据包)
- 客户端发送终止报文给客户端:FIN=1 seq=u,客户端等待响应
- 服务端接受客户端报文,发送响应报文:ACK=1 ack=u+1,seq=z:服务端发送报文给客户端,表示收到终止报文
- 客户端收到服务端报文,继续等待,服务端发送准备要关闭通信连接的确认报文:FIN=1,ACK=1,ack=u+1,seq=w
- 客户端收到确认报文,响应:ACK=1,seq=u+1,ack=w+1,服务端最后确认客户端释放通信连接的报文,然后释放通信连接资源,连接关闭
通俗解释
背景:工厂B因为生产的产品A利润低,决定放弃产品A的生产业务,客户A下了生产订单,听到消息决定退回给工厂B生产产品A的订货单,下面就是退订单的过程:
- 客户A发送退货订单给工厂B
- 工厂B接收到客户A的退货订单,回信息表示收到退货订单的要求
- 工厂B发送消息给客户A,表示产品A将要停止生产产品A
- 客户A收到消息之后表示可以同意工厂B停止生产产品A,并将信息发送给工厂B,B收到客户A的确认消息之后,决定关闭生产产品A的生产线,至此客户端A和工厂B之间的生产合作结束