Linux网络通信——信息的传输/TCP的三次握手四次挥手/TCP通信协议

文章目录

  • 原始通信
    • 集线器的诞生
    • 交换机的诞生
    • 路由器的诞生
      • 举例
      • 注意
    • IP地址的诞生
    • 子网的由来
    • 为什么要有服务器
  • 以微信为例解释发出的消息如何发送到目标的手中
  • TCP的三次握手和四次挥手
    • 三次握手
    • 四次挥手

原始通信

在通信的原始时代我们想要通信必须通过,线来连接你想和谁通信的话你需要有个线连接到他那边然后让接线员给你连线
在原始时代假如说你有一个主机
Linux网络通信——信息的传输/TCP的三次握手四次挥手/TCP通信协议_第1张图片
此时你只有这个主机没有连线没有各种东西,因此你无法与任何人交流。这时你想跟B交流你需要在你们中间弄根线
Linux网络通信——信息的传输/TCP的三次握手四次挥手/TCP通信协议_第2张图片
这根线就是你们用来交流的线,通过这根线你可以把消息发给他它也可以把消息发给你。可是如果说你需要和多个人进行交流呢难道一个人开一个口两个人就在电脑上开两个口??那也太不方便了把如果我要跟100个人联系那我的电脑上就要有100个空口来插线吗?由此聪明的人们想到了集线器

集线器的诞生

上面说了我们通过连线可以跟一个人交流可是如果我们需要跟多个人交流该怎么办?这时人们想到了可以弄一种机器把要连的线全弄到那个机器上这样子身为主机只需要连接那个机器就可以了,这样子的话你的主机就不需要开太多的口子了只需要连接集线器就可以了,可是集线器怎么知道我这个消息要发给谁呢?其实集线器也不知道,你跟他说你要给哪个ip地址的哪个端口号发消息他根本不认识这个,那么这该怎么班呢?其实很好理解的,我们可以想象一下高中班级点名。
Linux网络通信——信息的传输/TCP的三次握手四次挥手/TCP通信协议_第3张图片
在班级里老师点名难道你听不到吗?比如说你叫张三老师喊李四,你听不到老师喊李四吗?不是的你听的到但是你会给李四回答吗?当然不会因为我说了想象成高中班级点名不是大学班级点名。
是的其实集线器发送消息也是这样,他不知道这个消息要给谁因此他会把这个消息发送给所有人然后呢让你们 自己去看这个消息时发给谁的。这样说大家可能会感觉这东西智商是不是有些低啊所以这个东西时物理层的。

交换机的诞生

好了那么我懂了也就是说集线器是为了让我不用给电脑开太多口子所以把所有线路集中在一起的一个机器但是我感觉这也太不好了把比如说我叫zyf我要给cl同学发送消息我说晚上有空吗?我想和你约一个浪漫的晚餐然后呢大家都能接收到,即使说他可能看不到但是他确实收到了我感觉这太不好了有一种隐私被侵犯的感觉没有安全感,那么有没有一种东西是兼备了集线器的优点并且还能把消息准确的发送给一个指定的人的设备呢?这时候交换机就诞生了。
这时候呢,你会疑惑交换机时如何做到那么快的就把我的消息准确的给另一个人了其实这是因为交换机会维护一个哈希表这个表里存在映射关系从而将你发的消息准确给特定的主机。
假如你仍然要发给 B 一个数据包,构造了如下的数据结构从网口出去。
Linux网络通信——信息的传输/TCP的三次握手四次挥手/TCP通信协议_第4张图片
到达交换机的时候交换机内部维护的哈希表会对你的表头信息进行分析你要发送给谁通过哈希表找到对方,可是这时候就有疑惑了那假如说在最开始的时候呢?这个表肯定不可能你弄之前就存在了把肯定是得慢慢建立起来的把假如说表是空的那怎么办那么这时候其实就还是第一个那种给所有的主机都发送消息然后再看看谁接收了这个消息之后再把它映射进来其实就跟我们进入新班级的时候老师会让你一个一个上台自我介绍一下经过该网络中的机器不断地通信,交换机最终将 MAC 地址表建立完毕随着机器数量越多,交换机的端口也不够了,但聪明的你发现,只要将多个交换机连接起来,这个问题就轻而易举搞定~
可是这种方式只有目标只有几百台的时候还好万一是几千台几万台甚至是现在有了几个亿该怎么办

路由器的诞生

此时你想起来和当年一样的思路我们当时为什么发明集线器,因为为了减少电脑上直接相连的线路过多,那么现在集线器的线路端口过多该怎么办,那就再来一个机器并且让这个机器拥有自己独立的MAC地址这样我的交换机就可以把消息发给他再让他去找应该发给哪个交换器再让对方的那个交换器去发送消息

举例

其实这就跟我们学校是一样的,校长想给某个同学下达一个指令,那校长难道要亲自去找吗那校长不得累死啊,肯定是先看看这个学生属于哪个年纪把这个消息通知给级部长之后级部长也不行啊也忙啊级部长再给班主任说,在大学里班主任(也就是辅导员)他也很忙啊怎么办?那就跟寝室长说让寝室长传达。在计算机中就是下图
Linux网络通信——信息的传输/TCP的三次握手四次挥手/TCP通信协议_第5张图片

注意

路由器的每个端口都有一个MAC地址,

IP地址的诞生

经过上面的讨论我们终于可以有了实现更大规模的通信的基础了可是这时候你发现一个问题我怎么知道这个消息需不需要发送给路由器啊?这时候我们会想假如我们做一个规定呢?MAC地址是多少多少的都发给路由器其余的不发这样可以吗?肯定不行那这样咋办,于是我们创建了一个新的地址叫做IP地址可是有了IP地址就够了吗?显然不是

子网的由来

zyf 给 cl 发数据包,怎么知道是否要通过路由器转发呢?
答案:子网
如果源 IP 与目的 IP 处于一个子网,直接将包通过交换机发出去。

如果源 IP 与目的 IP 不处于一个子网,就交给路由器去处理。

好,那现在只需要解决,什么叫处于一个子网就好了。
192.168.0.1 和 192.168.0.2 处于同一个子网

192.168.0.1 和 192.168.1.1 处于不同子网

这两个是我们人为规定的,即我们想表示,对于 192.168.0.1 来说:

192.168.0.xxx 开头的,就算是在一个子网,否则就是在不同的子网。

那对于计算机来说,怎么表达这个意思呢?于是人们发明了子网掩码的概念

假如某台机器的子网掩码定为 255.255.255.0

这表示,将源 IP 与目的 IP 分别同这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同子网,就这么简单。

比如

A电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0

B电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0

C电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0

D电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0

那么 A 与 B 在同一个子网,C 与 D 在同一个子网,但是 A 与 C 就不在同一个子网,与 D 也不在同一个子网,以此类推。

为什么要有服务器

好了那么通过上面的简单的认识,我们终于可以远程发送消息了可是这时候又有一个问题身为消费者身为一个可能不是计算机专业的人甚至是九年义务教育都没有搞定的人你让我聊天的时候还得先知道自己要发送消息目标的端口号和ip地址这不是扯吗?就没有更好的办法让我想给谁发消息就给谁发消息不用知道他的ip地址啊
端口号这种乱七八糟的,很简单我们只需要有一个媒介就行了,我们找一个知道不就可以了,比如说你的一个亲戚要来看你可是他不知道你的班级也没法联系到你,那这时候怎么办呢它可以找你老师啊,找你的老师问一问不就好了,那如果我连老师的电话都不知道呢?那我们就做一个规定,比如说我们想要使用手机发送短信那你这个手机上就必须存在一个软件,这个软件的名字叫做信息,你想发送的话就必须下载这个软件。那么其实这个软件中你下载的信息就包含了我上面说的老师的电话。 那么上面提到的老师其实就是我们的服务器。这时候我们就知道了服务器最基本的一个作用就是帮我们把消息找到要发送的目标让我们即使不知道他的ip地址和端口号只需要知道他的姓名之类的也可以把自己的信息发送过去。

以微信为例解释发出的消息如何发送到目标的手中

那么我们以微信为例来解释一下,首先呢我们两个通信的话我们首先要创建连接,创建连接的话是通过服务器创建的,在创建连接时呢我们主机需要把自己的IP地址和端口号都发送给服务器然后呢服务器接受我们的ip地址和端口号,之后我们发送的消息其实是先发送给服务器再由服务器发送给你,因为服务器也是一个机器也有自己的IP地址和端口号,那么我们下载微信的过程其实就是获得与微信服务器创建连接的过程,微信下载好后我们就获得了微信服务器的ip和mac,然后就简单了我下载了微信因此我有微信服务器的ip地址和端口号微信服务器也有我的,我的微信好友呢,也拥有服务器的ip和端口号而服务器也拥有我好友的这些东西,那么现在我想给他发消息就只需要把消息给服务器服务器再把消息给我的好友就好了。而我的消息如何给服务器服务器又如何给我的好友这就是通过网卡啊路由器啊这些设备进行的。

TCP的三次握手和四次挥手

三次握手

TCP建立连接的时候会经历三次握手断开连接的时候会经历四次挥手那么三次握手和四次挥手该怎么理解呢?其实简单的来说就比如一个男孩比如说是zyf吧要追求女孩cl,那么这个男孩和这个女孩有如下的对话

*zyf:我喜欢你咱俩在一起吧
*cl:我也喜欢你你确定要和我在一起吗
*zyf:我确定我要和你在一起

于是两个人就在一起了那么这个其实就是一个三次握手我们用官方些的话说就是

  1. 第⼀次握⼿:Client进⼊SYN_SENT状态,发送⼀个SYN帧来主动打开传输通道,该帧的SYN标志位被设置为1,同时会带上Client分配好的SN序列号,该SN是根据时间产⽣的⼀个随机值,通常情况下每间隔4ms会加1。除此之外,SYN帧还会带⼀个MSS(最⼤报⽂段⻓度)可选项的值,表示客户端发送出去的最⼤数据块的⻓度。
  2. 第二次握手:Server端在收到SYN帧之后,会进入SYN_RCVD状态,同时返回SYN+ACK帧给Client,主要目的在于通知Client,Server端已经收到SYN消息,现在需要进行确认。Server端发出的SYN+ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment
    Number)值被设置为Client的SN+1;SYN+ACK帧的SYN标志位被设置为1,SN值为Server端生成的SN序号;SYN+ACK帧的MSS(最大报文段长度)表示的是Server端的最大数据块长度。
  3. 第三次握⼿:Client在收到Server的第⼆次握⼿SYN+ACK确认帧之后,⾸先将⾃⼰的状态会从SYN_SENT变成ESTABLISHED,表示⾃⼰⽅向的连接通道已经建⽴成功,Client可以发送数据给Server端了。然后,Client发ACK帧给Server端,该ACK帧的ACK标志位被设置为1,其确认序号AN(Acknowledgment Number)值被设置为Server端的SN序列号+1。还有⼀种情况,Client可能会将ACK帧和第⼀帧要发送的数据,合并到⼀起发送给Server端。

四次挥手

那么什么是四次挥手呢?四次挥手其实也很简单我们假设有一对情侣是w和z他们两个要分手
假如说w要和z分手
那么会有以下对话

*w:我们分手吧
*z:你确定分手吗
*w:我确定分手
*z:好吧那我们分手吧

那么官方语言呢

  1. 第一次挥手:主动断开方(可以是客户端,也可以是服务器端),向对方发送一个FIN结束请求报文,此报文的FIN位被设置为1,并且正确设置Sequence
    Number(序列号)和Acknowledgment
    Number(确认号)。发送完成后,主动断开方进入FIN_WAIT_1状态,这表示主动断开方没有业务数据要发送给对方,准备关闭SOCKET连接了。
  2. 第二次挥手:正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文,报文的Acknowledgment
    Number(确认号)值为断开请求报文的Sequence Number
    (序列号)加1,该ACK确认报文的含义是:“我同意你的连接断开请求”。之后,被动断开方就进入了CLOSE-WAIT(关闭等待)状态,TCP协议服务会通知高层的应用进程,对方向本地方向的连接已经关闭,对方已经没有数据要发送了,若本地还要发送数据给对方,对方依然会接受。被动断开方的CLOSE-WAIT(关闭等待)还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 第三次挥手:在发送完成ACK报文后,被动断开方还可以继续完成业务数据的发送,待剩余数据发送完成后,或者CLOSE-WAIT(关闭等待)截止后,被动断开方会向主动断开方发送一个FIN+ACK结束响应报文,表示被动断开方的数据都发送完了,然后,被动断开方进入LAST_ACK状态。
  4. 第四次挥手:主动断开方收在到FIN+ACK断开响应报文后,还需要进行最后的确认,向被动断开方发送一个ACK确认报文,然后,自己就进入TIME_WAIT状态,等待超时后最终关闭连接。处于TIME_WAIT状态的主动断开方,在等待完成2MSL的时间后,如果期间没有收到其他报文,则证明对方已正常关闭,主动断开方的连接最终关闭。被动断开方在收到主动断开方的最后的ACK报文以后,最终关闭了连接,自己啥也不管了。

Linux网络通信——信息的传输/TCP的三次握手四次挥手/TCP通信协议_第6张图片

想要一直不分开

你可能感兴趣的:(linux,linux,tcp/ip,网络)