计算机基础之-TCP 别再问我啦

协议 格式及部分含义

协议

源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;
32位序号/32位确认号: 后面详细讲;
4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60。(上面讲的)
6位标志位:
URG: 紧急指针是否有效
ACK: 确认号是否有效 序号-确认号-ACK应答机制
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
16位窗口大小: 后面再说

16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分.
16位紧急指针: 标识哪部分数据是紧急数据;
40字节头部选项: 暂时忽略

根据端口号找到上一层的进程

因为TCP报头中含有16位目的端口号,可以根据端口号找到上一层的进程然后交付。

如何解包-整个包长度

TCP的报头是变长报头,因为有选项的加入。每次我们先提取前20个字节,然后我们根据提到的报头中的 4位首部长度来得到整个报头(包括选项)的大小。

ACK应答机制

确认应答机制(ACK)是计算机网络中一种通信机制, 在TCP通信中,当发送方向接收方发送数据时,发送方会等待接收方返回一个确认应答(ACK)来确认已成功接收到数据。

    实现的方式:序号和确认序号保证了 响应应答针对的是哪一条消息的应答.
    序号字段指示TCP数据报中数据部分的第一个字节的序号,用于对数据进行编号和排序
    确认序号字段表示发送方期望下一个收到的字节的序号

序号-确认序号-实现TCP的可靠传输和流量控制:

1.保证请求和应答进行一一对应.
2.确认序号:确认序号之前的数据已经全部收到。(比如我发送了1000,2000,3000,然后接收方发送了确认序号1001,2001,3001,如果最后发送方只收到了3001,那么代表3001之前数据已经全部收到了,这是确认序号的含义所确定的)
3.允许部分确认丢失,或者不给应答。
确认部分丢失:例如发送方发送了1000,2000,3000,然后接收方接收到了并应答给发送方,发送方最后只收到了3001,但此时也没有问题 ,因为这代表3001之前的数据已经全部收到了
不给应答:当发送方发送了1000,2000,3000给接收方,但接受方只收到了1000,3000,此时只能给发送方1001应答,不能给3001应答,因为没有收到2000,通知发送方2000 3000需要重传

为什么要有两个字段(序号和确认序号)?

TCP是全双工的,任何一方,即可以收,也可以发!如果不加以区分,会使发送的数据和接收的数据混在一起。比如发送方可能把接收方发送的数据当做一个应答,或把对方的应答当做一个发送的数据。

5.如何保证顺序,报文中会携带序号,收到后会进行排序重组保证数据的顺序。确保数据按正确的顺序交付给应用层。

16位窗口大小-缓冲区

16位窗口大小表示接收方在接收数据时的可用缓冲区大小。该字段指示了发送方在不需要等待确认应答的情况下,可以连续发送给接收方的数据的最大量。

缓冲区
TCP也是全双工的,即发送数据的同时也可以接收数据,

TCP发送端和接收端都有发送缓冲区和接收缓冲区,而UDP是没有发送缓冲区的。

流量控制

为什么控制:接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送,就会造成丢包, 继而引起丢包重传等等一系列连锁反应.造成效率的下降。

接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “16位窗口大小” 字段, 通过ACK端通知发送端;
窗口大小字段越大, 说明网络的吞吐量越高;
接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端,发送端接受到这个窗口之后, 就会减慢自己的发送速度;
如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端.

16位紧急指针

16位紧急指针和URG标志位联系在一起。

当URG标志位被设置时,代表紧急指针有效,表示该报文数据段中有部分数据被标记位紧急数据,需要尽快优先处理。

紧急指针: 紧急指针是TCP报文头中的一个字段,占用16位,用于指示紧急数据在数据段中的偏移量位置。它表示从报文的起始位置开始,紧急数据的偏移量.

三次握手

在这里插入图片描述

为什么一定要三次握手?
1.为了验证双方的全双工,确保双方能够正常的发送和接收数据.

在第一次握手中,客户端向服务器发送SYN,如果服务器能够接收到该SYN并回复SYN+ACK,便可以确定客户端的发送和接收能力正常; 当客户端给服务端ACK请求并被服务端收到后(服务端收到了ACK确认),说明服务器的发送和接收能力正常。

2.为了服务器的安全

1)如果只有一次握手,那么可能会服务器可能会遭受攻击。比如一台主机同时大量的向服务端发送SYN请求,而我们一开始也说了,这些连接 是需要被维护的,而维护需要占用资源的。所以这样会大量的占用服务器资源,造成瘫痪,所以不可取。这便是SYN洪水攻击。

2)如果只有两次握手,第一次握手服务器连接建立好后,第二次向客户端发送请求,而客户端则可以直接把连接丢弃,这样就造成了服务器还在维护着连接,而客户端没有连接,依然可以大量的发送SYN连接请求,也不太可行.

3)只有三次握手时,当客户端也确认连接后,才正常进行连接。这样客户端便承担与服务端等价的资源消耗。每当客户端发送一个连接请求,必须客户端自己也与服务端成功连接后,服务端再进行维护。这样虽然服务端也维护这些连接,但自己主机上也在维护相同数量的连接。所以这样便可以有效的防止攻击。

拓展:三次握手后 服务端最后一个ack没收到

因为当握手完成后,客户端便会认为自己已经建立完毕,开始发送数据了。与此同时,客户端向服务端发送ACK报文,但如果此时由于一些原因,服务端没有收到这个ACK,服务端便不能建立连接。服务端没有建立连接,而客户端认为自己连接已经建立完毕了,开始发送数据,这肯定会造成问题了。

所以此时服务端会向客户端发送带有RST(重新连接)的标志位的报头,表示重新与客户端建立连接,此时客户端与服务端便重新开始三次握手。

四次挥手

流程:
在这里插入图片描述

1、客户端发送连接断开报文: 客户端首先向服务器发送一个连接连接报文,标志位中设置 FIN(Finish)标志,表示客户端不再发送数据。然后进入 FIN_WAIT_1 状态,等待服务器的确认。

2、服务器发送确认报文: 服务器收到客户端的连接断开报文后,会发送一个确认报文作为响应。服务器的确认报文中的标志位包括 ACK。ACK表示确认收到了客户端的连接断开报文,服务器进入 CLOSE_WAIT 状态。

3、服务器发送连接断开报文: 服务器确认终止与客户端的连接后,会发送一个连接断开报文,标志位中包含 FIN 标志。这表示服务器不再发送数据。服务器进入 LAST_ACK 状态,等待客户端的确认。

4、客户端发送确认报文: 客户端收到服务器的连接断开报文后,会发送一个确认报文作为确认。ACK 标志表示客户端确认收到了服务器的连接释放报文。这样,客户端和服务器都知道对方已确认关闭连接。

但客户端会有一段时间的TIME_WAIT状态之后在close

为啥 TIME_WAIT

确保对端收到最后的确认: 在TCP的四次挥手过程中,最后一次ACK确认报文可能会在网络上延迟或丢失。如果发送方立即关闭连接,这个确认可能不会到达对端,导致对端误认为连接没有正常关闭。通过进入TIME_WAIT状态,发送方可以等待一段时间,以确保对端收到最后的确认。

处理网络中滞留的报文: 在网络中,报文可能会因为网络延迟、路由器缓存或重传等原因而滞留一段时间。如果关闭连接后立即重新创建相同的IP地址和端口号的连接,就有可能接收到之前滞留的报文,这些报文可能会被错误地解释为属于新连接的数据。通过进入TIME_WAIT状态,可以排除滞留报文对新连接的干扰。

确保连接的唯一性: TIME_WAIT状态还可以确保在此状态下的连接的唯一性。在TIME_WAIT状态期间,对应的TCP连接四元组(源IP、源端口、目的IP、目的端口)会被保留一段时间。这样可以防止新建立的连接与该连接的四元组相同,避免可能的混淆和冲突。

虽然TIME_WAIT状态会占用一些资源,并延迟释放连接所使用的端口,但它是TCP协议中的重要机制,有助于维护连接的可靠性、完整性和唯一性。

滑动窗口

为什么:
对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段.这样做有一个比较大的缺点, 就是性能较差. 尤其是数据往返的时间较长的时候.
对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段.这样做有一个比较大的缺点, 就是性能较差. 尤其是数据往返的时间较长的时候.
那么如何控制发送的数据呢? 这里就用到了滑动窗口

滑动窗口是TCP协议中的一种机制,用于控制发送方和接收方之间的数据传输。它是一个动态的数据缓冲区,用于管理已经发送但未确认的数据序列号.
窗口大小指的是 拥塞窗口 和 对方窗口大小(接收能力)的最小值

收到ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答; 只有确认应答(ACK)过的数据, 才能从缓冲区删掉,即滑动窗口在自己的发送缓冲区中,属于自己的发送缓冲区一部分。
窗口越大, 则网络的吞吐率就越高,因为可发送的数据越多。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值