TCP三次握手一次挥手理解+JSONP笔记

Xixibao
11 min readMar 20, 2021

一、 TCP三次握手四次挥手
TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。客户端和服务器内存里要保存一份关于对方的信息,比如IP地址,端口号等。
TCP可以看成是一种字节流,他会处理IP层或以下层的丢包,重复以及错误问题。在建立链接的过程中,双方需要交换一些参数,放在TCP头部。
TCP采用三次握手建立一个连接,四次挥手关闭一个连接。

TCP服务模型
一个TCP连接又4个元组构成。分别是两个端口号和两个IP地址。一个TCP连接通常分为3个阶段,启动,数据传输,退出。

当TCP接收到另一段的数据时,他会回一个确认,但是这个确认一般会延迟一会儿。ACK是累积的,一个确认字节号N的ACK表示所有直到N的字节已经成功被接收了。这样的好处是如果一个ACK丢失,很可能后面的ACK就足以确认前面的报文段了。

一个完整的TCP连接是双向对称的,一旦建立了一个连接,这个连接上一个方向的每个TCP报文段都包含了相反方向上的报文段的一个ACK。

序列号的作用是使得一个TCP接收端可丢弃重复的报文段,记录以杂乱次序到底的报文段。因为TCP使用IP来传输报文段,而IP不提供重复消除或者保证次序的正确功能。但是TCP是一个字节流协议,绝对不以杂乱的顺序给上层程序发送数据。因此TCP接收端会被迫先保持大序列号数据不交给应用程序,直到缺失的小序列号报文被填满。

TCP Header:
源端口号;目的端口号;序列号;ACK;SYN;头部长度(数据偏移);RST;FIN

源端口和目的端口在TCP层确定双方进程,序列号表示报文段数据中第一个接收的字节号,ACK表示确认号,该确认号的发送方期待接受的下一个序列号,即被成功接受的数据字节序列号加1,这个字段只有ACK位被启用的时候才有效。

当新建一个连接时,从客户端发送到服务端的第一个报文段的SYN位被启用,这称为SYN报文段,这时序列号字段包含了在本次连接的这个方向上要使用的第一个序列号,即初始序列号ISN,之后发送的数据是ISN加1,因此SYN位字段会消耗一个序列号,这意味着使用重传进行可靠传输。而不消耗序列号的ACK则不是。

头部长度(图中的数据偏移)以32位字为单位,也就是以4bytes为单位,它只有4位,最大为15,因此头部最大长度为60字节,而其最小为5,也就是头部最小为20字节(可变选项为空)。

ACK — — 确认,使得确认号有效。 RST — — 重置连接(经常看到的reset by peer)就是此字段搞的鬼。 SYN — — 用于初如化一个连接的序列号。 FIN — — 该报文段的发送方已经结束向对方发送数据。

当一个连接被建立或被终止时,交换的报文段只包含TCP头部,而没有数据。

三次握手,四次挥手状态转换

三次握手:明确双方的收发能力是正常的

第一次握手:客户端发送网络包,服务器端收到了,这样服务器就可以得出结论,客户端的发送能力,服务器的接收能力正常。
第二次握手:服务端发包,客户端接受到了。客户端可以得出结论:服务端的接受发送能力,客户端的接收发送能力正常。
第三次握手:客户端发包,服务器端接受。这样服务器段得到结论,客户端接收发送能力正常,服务器段结束发送能力正常。

每次都是接受到数据包的一方可以得到一些结论,但是发送方没有任何头绪。

四次挥手:
TCP连接是双向传输的对等模式,就是说双方可以同时像对方发送和接收数据。当有一方要关闭链接时,会发送一个带着FIN的指令告知对方,我要关闭连接了,此时对方会回一个ACK,此时一个方向的链接关闭。但是另一个方向上仍然可以继续传输数据,等发完所有数据,会发一个FIN段关闭此方向上的连接,接收方发送ACK确认关闭链接。
⚠️:接收到FIN报文的一方只能回复一个ACK,无法立即返回对方一个FIN报文段。因为结束数据传输的指令是上层应用层给出的,我只是一个搬运工,无法了解上层意志。

三次握手的目的:
其实三次握手的目的并不只是让通信双方都了解到一个连接正在建立,还在于利用数据包的选项来传输特殊的信息,交换初始序列号ISN。
过程:
1、客户端发送一个SYN段,并指明客户端初始序列号(ISN(c));
2、服务器端发送自己的SYN段作为应答,同样指明自己的ISN(s)。为了确认客户端的SYN,将ISN(c)➕1作为ACK数值。这样没发送一个SYN,序列号就会加一。如果丢失就重传。
3、为了确认服务器端的SYN,客户端将ISN(s)+1 作为返回的ACK数值。

Xixibao