简述TCP三次握手和四次挥手

TCP是传输层的主要协议之一,其特点是面向连接的、可靠的进程对接进程的协议。

TCP报文首部格式

TCP报文段首部格式

源端口号:发送方进程端口号。
目标端口号:目的端口对应进程。
序号(Sep):为每个字节进行编号,由操作系统随机产生首个序号(0~65535),以该序号为原点,下一个数据包的序号顺序产生,以便于接收端正确重组。该序号独立产生,一个链接里A B双方的序号可以相同。
确认号(Ack):对发送端的回应消息,X+1,X=对方序号。
首部长度: TCP报头的大小,默认20字节。
保留:没有实际用处。
URG:紧急指针有效位,此位为1时紧急指针生效、 0则不生效。
ACK:ACK=1时,确认号生效, ACK=0时,确认号不生效。
PSH:标志位为1时,通知尽快将数据送至应用层。
RST:当RST为1时,通知重新建立TCP链接。
SYN:同步序号位,TCP需要建立链接时,为1。
FIN:FIN=1时,断开链接
窗口大小:大小可变,TCP的流控机制,可以根据网络畅通情况改变窗口大小。
校验和:差错控制,发送端通过算法(计算TCP首部、数据、其他填充字节)算出一个值,接收到数据包后接收端也算出一个值,值一样说明数据基本正确,值不同则丢弃该数据包
紧急指针:当URP=1时生效

TCP三次握手

这里写图片描述

第一次握手:PC1向PC2发送一个数据包 SYN为1(请求链接),其余全为0 ,随机产生一个序号(Seq)。

第二次握手:PC2回应PC1一个数据包,确认号(Ack)为对方序号+1,ACK=1(Ack生效)。随机产生一个Seq, SYN为1(请求链接)。这一步可以看做两个包,一个回应包,一个请求链接包,一般将这两步合并在一起。

第三次握手:PC1回应PC2一个数据包,确认号(Ack)为对方序号+1,控制位ACK=1

TCP作为可靠的协议,其可靠性依赖的就是ACK确认。A向B发送了一个TCP报文,B便要回复一个ACK确认,当A向B发送的数据包丢失时或B向A发送的ACK丢失,发送方在超时时间内未收到对方发来的ACK,发送方会一直周期性的重传数据包,直到收到ACK为止、或者达到重传上限重新建立TCP链接。

建立连接、数据传输、断开链接需要ACK确认。
RST报文、裸ACK报文不需要ACK确认

RST报文不需要ACK确认主机A发送完RST报文之后,操作系统会将和该TCP链接有关的内存全部释放。 若B收到了RST报文,也会释放相关内存。 若B未收到RST报文,可能会继续发送让接收方弹射出Reset报文的报文,到最后对方一样会收到重置报文,并最终释放内存。

ACK报文不需要ACK确认 收到没有携带任何数据的ACK报文不需要返回确认,否则会产生死循环。

数据包的组装由操作系统完成,组装完毕后交由报文中的目标端口,监听该端口的进程提取数据。

TCP的四次挥手

这里写图片描述

(1)PC1向PC2发送一个断开链接的数据包
(2)PC2回应PC1一个确认位=1的数据包
(3)PC2向PC1发送一个断开链接的数据包
(4)PC1向PC2回应一个确认位=1的数据包

从这四个步骤可以看出四次挥手和三次握手是大同小异的,四次挥手是将三次握手中的第二次握手分解成了两步,便有了四次挥手。

四次挥手为什么要将PC2的动作拆分成两步?

因为在四次挥手中有个半关闭概念,TCP一方(通常是客户端)可以终止发送数据,但任然可以接受数据,称之为半关闭

  1. 客户端向服务器发送FIN报文,半关闭这个链接;服务器回应ACK确认,接受半关闭
  2. 服务器继续发送数据,客户端只回复ACK确认,不在发送任何数据
  3. 当服务器发送完所有数据后,发送FIN报文段,客户端回应ACK确认,彻底关闭这个链接。
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值