你真的了解TCP/IP吗

背景:

从我们进入IT行业的那一刻起就不停的接触到TCP/IP协议。但是多数人多数时候对TCP/IP协议都知之甚浅,只是浅显的知道TCP是基于链接的可靠传输协议,有三次握手四次挥手,然后就没了。这篇文章就稍微补充一点这方面的知识。

一、网络模型

网络模型大致可以分:TCP/IP模型和OS模型。如下图

 可以发现,TCP/IP模型实际上就是将OS模型进行了更笼统的划分。主要分为如下四大层:

  • 应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、 网络远程访问协议(Telnet)以及我们Android使用最多的Http协议等。
  • 传输层:提供了节点间的数据传送服务,如传输控制协议(TCP)、 用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中, 这一层负责传送数据,并且确定数据已被送达并接收。
  • 网络互连层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目 的主机(但不检查是否被正确接收),如网际协议(IP)。
  • 主机到网络层:对实际的网络媒体的管理,定义如何使用实际网络 (如Ethernet、Serial Line等)来传送数据。

这里我们只需要记住这四层以及每一层的意义和对应的协议即可。

二、TCP协议

首先我们来看看数据包是如何在TCP/IP协议中传输的。

 通过上面的图我们可以清晰的发现数据包进过每一层都会有一个封包或拆包的过程。那么当数据到达传输层进过TCP协议封包后的数据包是个什么样的结构呢?

 在这个结构中我们需要重点关注序列号以及窗口大小,因为这会是接下来我们要说的内容会涉及的知识点。

2.1、三次握手

既然是说TCP协议,那免不了说一下它著名的三次握手

如图,TCP的三次握手 流程:

  • Client发送SYN=1和seq=x数据包到Server后进入SYN_SEND状态,等待服务端确认,这里的seq是随机生成的序列号。
  • Server接收到SYN数据包后,进行确认并返回SYN+ACK+ack+seq数据包,然后进入SYN_received状态。这里的ack=客户端的seq+1。而这里的seq是服务器随机生成的序列号
  • Client收到服务端的SYN+ACK数据包后,进行确认并返回ACK+seq+ack,然后进入Established状态,服务端接收到ACK数据包后同样进入Established状态。此时双方告知上层连接建立成功,就可以进行应用数据收发了。实际上第三次握手的时候Client就已经可以发送数据到对端了。

但这里我要说的不是三次握手的流程,我要说的是为什么要进行三次握手,而不是两次或者四次:

  • TCP是一个基于链接的可靠的传输协议。三次握手就是用来双方确认链接,保证TCP链接的可靠性的。
  • 而保证TCP链接可靠的核心就是在握手的过程中交换双方的初始序号,而我们后续每次发送的数据的时候并不是立马发送,socket会有个缓冲和排序的操作,等缓冲队列满后再一次发送。而发送每段数据都包含一个序列号,服务端和客户端收到数据包后校验序号并确认应答来保证数据的可靠和链路的可靠性。(而重发机制就是基于此实现的,如果没法收到确认应答则进行重发)而这个序列号的初始值就是通过三次握手来进行交换的。两次握手虽然能够交换初始序号,但是服务端的序号交换并没有进行确认操作,而四次握手又多余了,所以三次握手效率最高,且能够完成任务。这里还有个tcpNoDelay算法,如果开启不会等到接收到上一个包的确认应答后再发下一个包。

 大家都说三次握手可靠,那它就没有漏洞吗?当然有:

  • SYN洪泛攻击:通过向服务端所在端口发送大量伪造原地址的攻击报文,造成服务端的半开链接队列被占满,从而阻止其他用户进行访问。

解决攻击的方案:无效链接监控释放 、延缓TCP分配方法、防火墙

2.2、四次挥手

        既然有握手,那必然有要说拜拜的时候啦。我们先来看看四次挥手都干了啥:

 如图,四次挥手就是向对方发送FIN报文,并相互确认。但挥手为什么不像握手一样是三次而是四次呢(为什么是四次挥手):

  • TCP三次握手建立链接后是一个全双工的通信,当收到一方的FIN报文时只表示对方不再发送数据了,但依然能够接收数据,若要完全断开连接,就需要双方都发送FIN报文并相互确认才行。

四次挥手的最后一次发送确认包后为什么要等待2MSL(两个最大报文生成时间):

  • 这是因为如果最后一次发送确认报文丢失等情况发生时,导致对端没能收到确认包,那么对端在这等待的2MSL时间内会再次发送FIN报文并等待确认。这样做能够极大确保链接正常断开,避免端口冲突等情况。

2.3、滑动窗口机制

        这个问题呢,碰到的并不多。但是面试的时候面试官也不知道是为了装13还是为了啥,反正就是喜欢问。所以简单了解下吧

什么是滑动窗口:

  • 发送方和接收方都会维护一个数据帧的序列,这个序列被称作窗口。
  • 发送方的窗口大小由接收方确认。

滑动窗口能干嘛:

  •  确保数据不丢失:如果发送的数据丢失了可以重新发(也就是我们常说的重发机制)。
  • 控制发送速度    :  控制发送速度,以免接收方的缓存不够大导致溢出,同时控制流量也可以避免网络拥塞。

  • 10
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值