参考博文
https://juejin.cn/post/7138287951288467469
https://www.elecfans.com/d/1887056.html
java3y《对线面试官》
什么是TCP
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。--百度百科
目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式:
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
TCP报文
TCP协议有着自己的数据包格式,这里把TCP的数据包称为报文段(segment),TCP报文段封装在IP数据报中发送,TCP报文段由TCP首部和TCP数据区组成,首部区域包含了连接建立与断开、数据确认、窗口大小通告、数据发送相关的所有标志和控制信息。如下图:
序列号:在初次建⽴连接的时候,客户端和服务端都会为「本次的连接」随机初始化⼀个序列号。(纵观整个TCP流程中,序列号可以⽤来解决⽹络包乱序的问题)
确认号:该字段表示「接收端」告诉「发送端」对上⼀个数据包已经成功接收(确认号可以⽤来解决⽹络包丢失的问题)
标记位:SYN为1时,表示希望创建连接。ACK为1时,确认号字段有效。FIN为1时,表示希望断开连接。RST为1时,表示TCP连接出现异常,需要断开。
TCP三次握手
TCP三次握⼿的过程其实就是在:确认通信双⽅(客户端和服务端)的序列号第一次握手:
最开始,客户端和服务端都处于close状态
服务器主动监听某个端口,处于listen状态
客户端随机生成序列号,将标志位置为SYN(意味着要连接),然后把该报文发送给服务端,自己进入SYN_SEND状态
第二次握手;
服务端接收到客户端请求后,自己也初始化对应的序列号(server_isn),在确认号字段里填上client_isn+1(相当于告诉客户端,已经收到发过来的序列号了)
并且把SYN和ACK标记位都置为1
把该报文发送给客户端,服务端状态变为SYN-REVD 状态
客户端收到服务端发送的报文后,明白服务端已经收到自己的序列号(通过确认号可以知道),并且接收到了服务端的序列号(server_isn)
客户端需要告诉服务端自己收到了服务端发送过来的序列号,在确认号上填写server_isn+1,标记ACK为1
客户端发送报文后,进入ESTABLISHED状态,而服务端接收到客户端的报文后,也进入ESTABLISHED状态 总的来说就是,双方生成自己的序列号并发送给对方看对方能不能接收到,如果接收到就给个通知。该过程可以看到双方都有发送和接收能力。
可以是两次吗?
两次握手只能保证客户端的序列号被服务端成功接收,而服务器无法确认自己的序列号是否被客户端成功接收,所以是不行。
标签:报文,TCP,序列号,连接,服务端,客户端 From: https://www.cnblogs.com/deity-night/p/17207048.html