重学系列---网络协议(科普篇)

1,641 阅读11分钟

本文主要是对TCP/IP协议进行学习,如果对其他部分不感兴趣可直接阅读TCP/IP协议部分

概念

什么是计算机网络?		
利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按照不同的形式连接起来,以功能完善的网络软件以及协议实现资源共享和信息传递的系统

主要网络有哪些?
1.局域网
2.城域网
3.广域网

计算机网络体系结构

我们认知中有OSI模型TCP/IP模型两种

OSI模型

OSI模型是国际标准化组织(ISO)为了规划协议层级的划分制定的开放系统互联模型(OSI,Open System Interconnection)模型。

该模型根据网络功能制定了7层网络协议结构,从下到上依次:

物理层(7) 链路层(6) 网络层(5) 传输层(4) 会话层(3) 表示层(2) 应用层(1)

其中7654的四层中是数据传输服务的,物理层是真正的传输数据的,链路层、网络层、传输层主要写入对应数据的传输信息,而应用层、表示层、会话层则是为用户提供服务的

但是,在实际的网络传输中,并不如此,实际传输中我们采用的是TCP/IP四层模型

TCP/IP模型

在TCP/IP模型中,将OSI模型中的会话层(3) 表示层(2) 应用层(1) 上三层简化曾成了应用层,将物理层(7) 链路层(6) 简化为了链路层,因此出现了四层模型

应用层(1) 传输层(2) 网络层(3) 链路层(4)

用一幅图简单的总结为: OSI模型和TCP/IP模型

TCP/IP协议

基础

常说的TCP/IP协议,你是不是还认为它只是处于某一层呢?

现在告诉你TCP和IP它们不是在同一层的,TCP是属于传输层当中的,这个和我们常见的TCP、UDP、 UDT网络协议位于同一层。都是传输层的东西,而IP是属于网络层

请看 TCP/IP协议层级图

既然不是同一层,那为什么我们要叫它为TCP/IP协议呢?

其实它应该是TCP/IP协议簇,是Internet的基础,也是当今最流行的组网形式,TCP/IP是一组协议的代名词,全称为传输控制协议/网际协议(Transmission Contorl Protocol/Internet Protocol),是指能够在多个不同的网络间实现信息传输的协议簇。

比如我们熟悉的TCP、TFTP、HTTP、SMTP、FTP、UDP、IPDNS等都包含在这个协议簇中,只是因为在TCP/IP协议中TCP协议和IP协议最具有代表性,所以被称为TCP/IP协议

数据传输

了解过TCP/IP网络模型后,现在窥探下此模型中数据如何进行传输的?

先看图 模拟数据传输 A用户发送一个请求给B用户,且看B用户是如何接收到的?

可以看到当A发送完请求后,每一层结构中除了接收到上一层传递过来的请求数据外还附带了独有的包首部信息,而B用户在接收到数据的时候,接收到数据后按照传输层级依次解析包首部信息,获取到当前的真实数据,直到最后的B用户在用户层中接收到了A用户在用户层中发送的真实数据(I'm Desson)

简单总结为:

发送数据的过程是一个装箱的过程,接收数据的过程就是一个拆箱的操作

几个概念:

 包:  相当于发送请求的网络包
 段:  TCP数据流中的信息
 片:  IP中数据单位
 消息: 应用协议中数据的单位
 帧:  数据链路层中包的单位

说了这么多,现在可以进入到TCP/IP的重头戏,再晚点点~,先让我们熟悉几个名词

名词含义
SYNsynchronous建立连接
ACKackmowledgement 确认
FINfinish 结束
seqsequence number 顺序序号
ackackmowledgement number 确认序号

建立连接(三次握手)-相亲

三次握手其实就是在建立一个TCP连接(socket连接)时,需要客户端和服务端总共发送3个包

我们来个场景

小明(客户端)和王美丽(服务端)因为家里原因被催着去相亲

两个约定到了某个咖啡厅见面,王美丽先到了,小明后到
小明找到了王美丽的位置,并说道:“你好,美女,请问你是王美丽吗”?
王美丽回复:“帅哥,你好,我是王美丽,请问你是小明吗?”
小明:“对的,我是小明,很高兴认识你”
在确认完双方信息后,两人开始了愉快的相亲之旅

上面的对话是不是很简单?看似短短几句话语,其中包含了一些信息:

1.两人的沟通是不是存在问题?(基础条件)
2.是否确认双方身份?

假如说基本的正常沟通都不行,就算确认了身份也是扯淡,都没法交流,还怎么玩嘛?

好了,当信息都确认完成后,我们简单分析下他们的对话

你好,美女,请问你是王美丽吗?

当小明问完后,相当于带了一个SYN的标识(SYN=1),此刻现在处于发送状态(SYN_SEND),在等待着王美丽的反馈。王美丽这个名字相当于一个要传递数据的seq序列号,此时-----> 第一次握手

帅哥,你好,我是王美丽,请问你是小明吗?

王美丽听到了小明的提问,此刻进入了接收的状态(SYN_REVD),当王美丽回复就是王美丽的时候,此刻接收到了对方的sqe序列,同时自己也建立了一个标识(SYN=10),接收到信息建立了ACK(ACK=1)并且通过自己的ack保存了小明的seq(王美丽),同时发送了自己的数据seq,反问对方是不是小明,到此-----> 第二次握手 完成

对的,我是小明,很高兴认识你

小明接收到了王美丽的消息(ACK=10),并且回答她就是小明,也就是针对于王美丽的seq做出了确认响应,此时-----> 三次握手 结束,于是乎,相亲之旅就这样开始了

用图表示为:

TCP/IP三次握手过程

在上图中,看到了我写的一个疑问,SYN洪泛攻击,这是个什么鬼?在这里先不说,后面解答,顺便提一嘴,什么是窗口滑动?什么是拥塞控制,这个大家自行了解,本文仅做科普

对于三次握手还不是很了解的小伙伴,建议自己使用下抓包工具看下,这里推荐使用【wireshark

关闭连接(四次挥手)-分手

我们继续小明和王美丽的故事

小明(客户端) 王美丽(服务端)

小明和王美丽相亲很顺利,两人成了恋人关系,于是王美丽住进了小明的家

某一天,两人因为某些意见不一致大吵一架,小明很气愤,于是
小明:“看看你现在的样子,完全不是当初我认识的那个人,变得让我很讨厌”
王美丽愣了一会,说道:“难道你不是?现在的你简直让我作呕”
说完,过了一会,王美丽越想越气,就对小明说道:“我们分手吧”
小明听后:“分手就分手”
过了一会,王美丽收拾好了东西,离开了小明的家,两人彻底byebye

我们下分析语句

小明:“看看你现在的样子,完全不是当初我认识的那个人,变得让我很讨厌”

小明说完这句话,等待王美丽的反应,此刻进入到了FIN_WAIT_1的状态,这句话就相当于带了一个标识(FIN=1)以及一个变得让我很讨厌的序列号seq ----->第一次挥手

王美丽愣了一会,说道:“难道你不是?现在的你简直让我作呕”

王美丽听到这话瞬间就不开心了(进入CLOSE_WAIT状态),好啊,你敢说老娘不好(接收到小明的标识ACK=1),现在的你简直让我作呕(seq序列号),小明此刻进入到了FIN_WAIT_2的状态 ----->第二次挥手

说完,过了一会,王美丽越想越气,就对小明说道:“我们分手吧”

王美丽越想越生气主动提出了分手,进入了CLOSE状态,我们分手吧,携带了一个标识(FIN=100)以及我们分手吧的序列号seq,小明此刻进入到了TIME_WAIT状态 ----->第三次挥手

小明听后:“分手就分手”

小明正在气头上,不加思考的就回答了分手,好啊,你敢说老娘不好(接收到王美丽的标识ACK=100),并且带上了分手就分手(seq序列号),王美丽听到进入了CLOSED状态 ----->第四次挥手

虽然小说分手就分手,但是王美丽还在这里啊,不一定会分手的,所以王美丽提着行李箱离开了小明的家的时候,才意味着这段感情真的到头

用图描述的话就是下面这个样子 TCP/IP四次挥手

TCP/IP特点

简单总结为:

  • 面向连接性
  • 可靠性
  • 全双工
  • 数据排序
  • RTT和RTO

关于面试

  • 1.请说说一次完整http的请求过程?
1.首先进行DNS域名解析(本地浏览器缓存、操作系统缓存、DNS服务器)
2.三次握手建立TCP连接
3.客户端发起HTTP请求
4.服务端响应HTTP请求
5.客户端解析HTML代码,并请求HTML代码中的资源
6.客户端渲染展示内容
7.关闭TCP连接
  • 2.为什么TCP连接中需要三次握手?
TCP是面向连接的,所以需要双方都确认连接的建立
三次握手才能确认双方的接收与发送能力是否正常
  • 3.为什么TCP连接关闭为什么四次挥手?
TCP是一种全双工协议,所以需要双方都确认关闭连接

在TCP关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。
只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。
故需要四次挥手
  • 4.为什么四次挥手要有TIME_WAIT状态?
用来重发可能丢失的ACK报文
  • 5.概述下什么是DDOS攻击和SYN洪水攻击?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。
SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,
由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
SYN 攻击是一种典型的 DoS/DDoS 攻击
  • 6.什么是半连接状态?
当服务器第一次收到客户端的SYN之后,就会处于SYN_RCVD状态,此时双方还没有完全建立其连接,
服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列
    1. 为什么TIME_WAIT需要等待2SML?
TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态(MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。)

保证客户端发送的最后一个ACK报文段能够到达服务端
防止“已失效的连接请求报文段”出现在本连接中。

学习资料推荐

《图解Http》
《Java网络编程》
《TCP/IP详解 卷1:协议》
《计算机网络  自顶向下方法(第七版)》

学习任重而道远,前进吧,骚年!