【TCP 三次握手、四次挥手】

一、TCP三次握手

1、完整过程

1.TCP三次握手只是建立连接的过程,和后续的数据传输关系无关。
2.两端未建立连接时,均处于初始状态CLOSED

1、第一次握手

1.客户端给服务端发送带有初始序列号的SYN数据包,由CLOSED状态进入到SYN_SENT状态。服务端Socket处于监听状态LISTEN,当收到来自客户端的数据包后,会将客户端初始序列号的值加1作为ACK包,并和SYN包一起回发给客户端,由LISTEN状态进入到SYN_RCVD状态。

2、第二次握手

客户端收到来自服务端的数据包后,会将客户端初始序列号的值加1作为ACK包,并发送给服务端,由SYN_SENT状态进入到ESTABLISH状态。

3、第三次握手

服务端收到来自客户端的ACK数据包后,由SYN_RCVD状态进入到ESTABLISH状态,至此连接连接建立成功,双方互相发送数据。

2、相关要点

1、Socket数据结构

1.TCP使用Socket数据结构来实现不同设备之间的连接,以保证不同传输通道之间不会产生串联或相互影响。
2.Socket包含IP地址和端口号,一个设备可以对应一个IP,不同的传输通道用端口号区分

2、TCB传输控制块

1.TCP使用TCB传输控制块的数据结构把发给不同设备的数据封装
2.TCB数据块包含数据发送双方的Socket信息,以及装载数据的缓冲区。
3.在两个设备要建立连接和发送数据之前,双方会分配内存建立起TCB数据块。
客户端TCB主动打开
客户端主动向服务器表达自己想建立数据连接的请求,此时TCB状态为:Active Open(Create TCB)。
服务端TCB被动打开
服务器在构建TCB模块时会默认将客户端对应的Socket数据初始化为0,服务器保持监听,等待客户端从该端口向它发起连接请求,此时TCB状态为:Passive Open(Create TCB)。
4.双方的Socket和TCB数据结构准备好后,就可以进入三次握手的过程。

3、数据包和ISN初始序列号

1.TCP数据包一种用来传输数据,一种数据包用来发送控制信息,TCP报头中的标志位用于表明数据包是用于数据发送还是用于传输控制信息。
2.初始序列号ISN是随机数,而不是每次都以1开始,三次握手是实现客户端和服务端交互初始序列号,以便让对方知道如何按序列号组装数据,如果ISN是固定的,攻击者很容易猜出后续的确认号。

4、报头的标志位

1.SYN比特位启动表明当前数据包目的是实现双方数据状态同步
2.ACK比特为启动时,表明数据包用于通知接收方已收到数据
3.客户端先通知服务器建立连接,双方再通知对方自己数据发送时的初始序列号,然后实现参数交换,把自己的有关信息发送给对方。

5、半连接队列

1、服务器第一次收到客户端的SYN或服务端给客户端回SYN+ACK包时,处于SYN_RCVD状态,此时双方并没有建立连接,服务器会将这种状态下的请求放在半连接队列中, 。
2.全连接队列就是完成三次握手之后,建立的连接就会放在全连接队列中,如果队列满了就有可能出现丢包的现象。

6、SYN-ACK重传

服务器发送完SYN-ACK包,如果没有收到客户端的ACK确认包,服务器进行首次重传,等待一段时间还没有收到客户端确认包,会进行二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。

7、数据包的大小

三次握手过程中需要传输的控制参数为最大分片大小,也就是数据包中一次能发送的最大字节数,当要发送的数据大于该参数时,数据就必须分成若干小块分别发送。

8、握手为什么是三次

1.第一次握手服务端收到客户端发送的数据包,服务端认为客户端发送能力正常、服务端接收能力正常
2.第二次握手,客户端收到了服务端发送的数据包,客户端认为服务端接收与发送能力、客户端接收与发送能力正常
3.第三次握手用于让服务确认客户端接收能力正常,客户端和服务端都认为自己和对方的接收与发送能力均正常

9、三次握手过程是否可携带数据

1.第一次、第二次握手不可以携带数据,其原因是防止服务器受到攻击,服务器不用花费太多时间去处理第一次和第二次。
2.第三次的时候,客户端已经处于ESTABLISH状态,且知道了服务器的接收发送能力正常,所以可以携带数据。

二、四次挥手

1、第一次挥手

客户端申请断开连接,发送FIN报文给服务端,客户端由ESTABLISH状态进入到FIN_WAIT1状态。

2、第二次挥手

服务端收到FIN报文,发送ACK报文(把客户端的序列号值+1作为ACK报文)给客户端,服务端由Establish状态进入到CLOSED_WAIT状态,客户端由FIN_WAIT1状态进入到FIN_WAIT2状态。

3、第三次挥手

服务端发送FIN报文(指定一个序列号)给客户端,服务端由CLOSED_WAIT状态进入到LAST_ACK状态。客户端收到FIN报文,发送ACK报文(把服务端的序列号值+1作为ACK报文)给服务端,客户端由FIN_WAIT2状态进入到TIME_WAIT状态。

4、第四次挥手

服务端收到ACK报文,由LAST_ACK状态进入到CLOSED状态。客户端在2MSL计时时间后,由TIME_WAIT状态进入到CLOSED状态。

5、为什么客户端要进入TIME_WAIT状态

1.客户端发送了ACK之后不会直接到CLOSED状态的原因是要确保服务器是否已经收到了ACK报文,如果没有收到的话,服务器会重新发送FIN报文给客户端,客户端再次收到ACK报文之后,就知道之前的ACK丢失了,然后再次发送ACK报文。
2.TIME_WAIT持续时间至少是一个报文的来回时间,也就是2MSL,计时时间内没有再次收到FIN报文,就代表对方成功接收ACK报文,此时才会处于CLOSED状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值