10.TCP03_序号_确认号_建立连接

在这里插入图片描述

TCP Retrasmission

Fast Retrasmission

TCP—序号、确认号

建立连接三次握手,释放连接四次挥手

在这里插入图片描述

SYN:同步

先建立连接,然后在开始发送数据,服务器连续发好几个包,客户端才发一个

两方都有可能成为接收方,都有可能成为发送方,数据的传输是双向的。

在这里插入图片描述

真实情况是连发好几个包,才发送一个确认号

序号:告诉对方,我现在发送到哪里了

ACK:告诉对方我现在接收到那了,你接下来继续给我发

以上图片用到的数据是相对值,并非真实值,真实值是一个很大的值

在这里插入图片描述

第一部分是建立连接,第二部分才开始收发数据

序号的值是随机生成的,两端的初始值完全不一样。

在这里插入图片描述

在这里插入图片描述

建立连接的请求,同步包数据部分是零的,只有首部

ack在收到对方多少的数据上加1

建立连接之后,客户端发送http请求,数据部分占k字节

在这里插入图片描述

在这里插入图片描述

对对方发送数据的回应,数据部分为0

只要是基于TCP的,你都要先建立连接,在发送数据,在释放连接

在这里插入图片描述

三次握手,一般都是客户端发起,不可能是服务器发起的

在这里插入图片描述

客户端一开始是出于关闭状态的

服务器占用一个端口,在这个端口上运行服务器软件,进行监听客户端发过来的数据

TCP—建立连接—状态解读

◼ CLOSED:client处于关闭状态

◼ LISTEN:server处于监听状态,等待client连接

◼ SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态

◼ SYN-SENT:表示client已发送SYN报文,等待server的第2次握手

◼ ESTABLISHED:表示连接已经建立

TCP—建立连接—前2次握手的特点

◼ SYN都设置为1

◼ 数据部分的长度都为0

◼ TCP头部的长度一般是32字节

固定头部:20字节

选项部分:12字节

◼ 双方会交换确认一些信息

比如MSS、是否支持SACK、Window scale(窗口缩放系数)等

这些数据都放在了TCP头部的选项部分中(12字节)

在这里插入图片描述

只有拿到windows scale,根据windows,才会知道windows size

windows*windows scale=windows size

TCP—建立连接—疑问

◼ 为什么建立连接的时候,要进行3次握手?2次不行么?

主要目的:防止server端一直等待,浪费资源

◼ 如果建立连接只需要2次握手,可能会出现的情况

假设client发出的第一个连接请求报文段,因为网络延迟,在信息交流完毕,连接释放以后的某个时间才到达server

本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出的一个新的连接请求

于是server就向client发出确认报文段,同意建立连接

如果不采用“三次握手”,那么只要server发出确认,新的连接就建立了

由于现在client并没有真正想连接服务器的意愿(我已经拿到了我想要的数据,没有必要再发一次),因此不会理睬server的确认,也不会向server发送数据

但server却以为新的连接已经建立,并一直等待client发来数据(是客户端先主动发,我想要什么),这样,server的很多资源就白白浪费掉了

◼ 采用“三次握手”的办法可以防止上述现象发生

例如上述情况,client没有向server的确认发出确认,server由于收不到确认,就知道client并没有要求建立连接

◼ 第3次握手失败了,会怎么处理?

此时server的状态为SYN-RCVD,若等不到client的ACK,server会重新发送SYN+ACK包

如果server多次重发SYN+ACK都等不到client的ACK,就会发送RST包,强制关闭连接(把服务器给惹毛了)

在这里插入图片描述

(看到超时那部分就可以了)

猜你喜欢

转载自blog.csdn.net/m0_53008479/article/details/120749676