最后更新:2022-02-17 03:22:09 手机定位技术交流文章
说明:
三次握手建立连接
四次挥手断开连接
例:
下图是一次TCP通讯的时序图。TCP连接建立断开。包含大家熟知的三次握手和四次握手。
在这个例子中,首先客户端主动发起连接、发送请求,然后服务器端响应请求,然后客户端主动关闭连接。两条竖线表示通讯的两端,从上到下表示时间的先后顺序,注意,数据从一端传到网络的另一端也需要时间,所以图中的箭头都是斜的。双方发送的段按时间顺序编号为1-10,各段中的主要信息在箭头上标出,例如段2的箭头上标着SYN, 8000(0), ACK1001, ,表示该段中的SYN位置1,32位序号是8000,该段不携带有效载荷(数据字节数为0),ACK位置1,32位确认序号是1001,带有一个mss(Maximum Segment Size,最大报文长度)选项值为1024。
1.客户端发送一个带SYN标志的TCP报文到服务器(将syn位置1,不写默认0)。这是三次握手过程中的段1。
(SYN客户端要求请求连接服务器)

客户端发出段1,SYN位表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地址,每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺序,也可以发现丢包的情况。
另外,规定SYN位和FIN位也要占一个序号,这次虽然没发数据,但是由于发了SYN位,因此下次再发送应该用序号1001。mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。
2.服务器端回应客户端,是三次握手中的第2个报文段,同时带ACK标志和SYN标志(置1)。它表示对刚才客户端SYN的回应和确认; 同时又发送SYN给客户端 询问客户端是否准备好进行数据通讯。
(ACK确认了客户端连接请求,发送SYN同时服务器请求客户端连接)

服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就是应答了客户端的连接请求,同时也给客户端发出一个连接请求,同时声明最大尺寸为1024。
3.客户必须再次回应服务器端一个ACK报文,这是报文段3。
(ACK客户端确认服务器连接请求)

客户端发出段3,对服务器的连接请求进行应答,确认序号是8001。在这个过程中,客户端和服务器分别给对方发了连接请求,也应答了对方的连接请求,其中服务器的请求和应答在一个段中发出,因此一共有三个段用于建立连接,称为“三方握手(three-way-handshake)”。在建立连接的同时,双方协商了一些信息,例如双方发送序号的初始值、最大段尺寸等。
在TCP通讯中,如果一方收到另一方发来的段,读出其中的目的端口号,发现本机并没有任何进程使用这个端口,就会应答一个包含RST位的段给另一方。例如,服务器并没有任何进程使用8080端口,我们却用telnet客户端去连接它,服务器收到客户端发来的SYN段就会应答一个RST段,客户端的telnet程序收到RST段后报告错误Connection refused:
$ telnet 192.168.0.200 8080
Trying 192.168.0.200…
telnet: Unable to connect to remote host: Connection refused
2.报头格式
序列号seq和确认序列号ack
序列号:代表tcp报文发送序列
确认序列号:确认收到对方的报文,期望下一次对方的序列号为我的确认序列号 数值等于对方发过来的序列号+上一次发送的标志位长度(SYN(1)(全部都是1)+数据报文长度(无))
说明:三次握手时候一律没有收发数据,三次握手成功后便会携带数据
第一次握手seq=随机数x
ack=0
第二次握手seq=随机数y(和第一次毫无关系)
ack=x+1+0
第三次握手seq=x+1
ack=y+1+0

1.客户端发送SYN,服务器没有回ACK会出现什么问题
没有回应会占用listen创建的未完成连接队列,连接队列数量有限,其他连接就会连接不上
本文由 在线网速测试 整理编辑,转载请注明出处。