(10)分布式系统的基石TCP/IP通信协议

网络的知识比较复杂。我曾经看过一本书叫做计算机网络自顶向下方法,很可惜自己没有耐心把它看完,只是看了前面的几个章节,涉及了应用层,运输层,以及网络层,后面的章节就没有看了,后面有机会打算看完好好梳理一番。
下面的只是简单的讲解一下用得到的知识。

第一节通信协议在分布式架构中的核心应用

1.网络领域的知识

协议:tcp、udp、multicast
io : bio, nio(netty,mina ), ano
socket
序列化和反序列化

2.一个 http 请求,在整个网络中的请求过程

当应用程序用T C P传送数据时,数据被送入协议栈中, 然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息

当目的主机收到一个以太网数据帧时,数据就开始从协议 栈中由底向上升,同时去掉各层协议加上的报文首部。每 层协议盒都要去检查报文首部中的协议标 识, 以确定接收数据的上层协议。这个过程称作分用

image.png

3.为什么有了MAC层还要走IP层呢?

mac地址就好像个人的身份证号,人的身份证号和人户口 所在的城市,出生的日期有关,但是和人所在的位置没有关系,人是会移动的,知道一个人的身份证号,并不能找 到它这个人,mac地址类似,它是和设备的生产者,批次,日期之类的关联起来,知道一个设备的mac,并不能 在网络中将数据发送给它,除非它和发送方的在同一个网 络内。所以要实现机器之间的通信,还需要有ip地址的概念,ip地址表达的是当前机器在网络中的位置,类似于 城市名+道路号+门牌号的概念。通过ip层的寻址,我们能知道按何种路径在全世界任意两台Internet上的的机器间传输数据

第二节IP 协议和 TCP/UDP 协议

1.什么是协议

协议相当于两个需要通过网络通信的程序达成的一种约定, 它规定了报文的交换方式和包含的意义。比如(HTTP)为 了解决在服务器之间传递超文本对象的问题,这些超文本对象在服务器中创建和存储,并由 Web 浏览器进行可视 化,完成用户对远程内容的感知和体验

2.什么是 IP 协议?

TCP和UDP是两种最为著名的传输层协议
他们都是使用I P作为网络层协议。IP协议提供了一组数据报文服 务,每组分组报文都是由网络独立处理和分发,就像寄送 快递包裹一样,为了实现这个功能,每个IP报文必须包 含一个目的地址的字段;就像我们寄送快递都需要写明收 件人信息,但是和我们寄送快递一样,也可能会出现包裹 丢失问题,所以IP协议只是一个“尽力而为”的协议,在网络传输过程中,可能会发生报文丢失、报文顺序打乱,重复发送的情况。IP协议层之上的传输层,提供了两种可以选择的协议,TCP、UPD
两种协议都是建立在IP层所提供的服务基础上,根据应用程序的不同需求选择不同方式的传输

  • TCP/IP
    TCP协议能够检测和恢复IP层提供的主机到主机的通信中可能发生的报文丢失、重复及其他错误。TCP 提供了一 个可信赖的字节流通道,这样应用程序就不需要考虑这些问题。同时,TCP协议是一种面向连接的协议,在使用TCP 进行通信之前,两个应用程序之间需要建立一个TCP连接, 而这个连接又涉及到两台电脑需要完成握手消息的交换
  • UDP/IP
    UDP协议不会对IP层产生的错误进行修复,而是简单的扩展了 IP 协议“尽力而为”的数据报文服务,使他能够在应用程序之间工作,而不是在主机之间工作,因此使用UDP 协议必须要考虑到报文丢失,顺序混乱的问题

3.TCP 是如何做到可靠传输的?

详细的参考博客: https://www.cnblogs.com/Andya/p/7272462.html

  • 三次握手 :(建立可靠的链接)
    由于TCP协议是一种可信的传输协议,所以在传输之 前,需要通过三次握手建立一个连接,所谓的三次握手, 就是在建立TCP链接时,需要客户端和服务端总共发送3个包来确认连接的建立

    image.png

  • TCP 四次挥手协议
    四次挥手表示 TCP 断开连接的时候,要客户端和服务端 总共发送 4 个包以确认连接的断开;客户端或服务器均可主动发起挥手动作(因为 TCP 是一个全双工 协议),在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作

  • 为什么连接的时候是三次握手,关闭的时候却是四次握手?
    三次握手是因为因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK报文是用来应答的,SYN 报文是用来同步的。但是关闭连
    接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET(因为可能还有消息没处理完),所以只能先回复一个 ACK 报文,告诉 Client 端,"你发的 FIN 报文
    我收到了"。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步握手。

4. 数据传输过程的流量控制和确认机制 ?

建立可靠连接以后,就开始进行数据传输了。在通信过程 中,最重要的是数据包,也就是协议传输的数据。如果数 据的传送与接收过程当中出现收方来不及接收的情况,这时就需要对发方进行控制以免数据丢失。
利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制
TCP的窗口单位是字节,不是报文段,发送方的发送 窗口不能超过接收方给出的接收窗口的数值

  • 滑动窗口协议
    滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送 数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题;发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口


简单解释下,发送和接受方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大,而导
致溢出,同时控制流量也可以避免网络拥塞。下面图中的4,5,6 号数据帧已经被发送出去,但是未收到关联的ACK,7,8,9 帧则是等待发送。可以看出发送端的窗口大小为6,这是由接受端告知的。此时如果发送端收到 4 号ACK,则窗口的左边缘向右收缩,窗口的右边缘则向右扩展,此时窗口就向前“滑动了”,即数据帧 10 也可以被发送。

  • 发送窗口
    就是发送端允许连续发送的幀的序号表。 发送端可以不等待应答而连续发送的最大幀数称为发送窗口的尺寸
  • 接收窗口
    接收方允许接收的幀的序号表,凡落在接收窗口内的幀, 接收方都必须处理,落在接收窗口外的幀被丢弃。接收方每次允许接收的幀数称为接收窗口的尺寸

第三节通信的性能问题

1.传统的bio模型

我们发现TCP响应服务器一次只能处理一个客户端请 求,当一个客户端向一个已经被其他客户端占用的服务器 发送连接请求时, 虽然在连接建立后可以向服务端发送数 据,但是在服务端处理完之前的请求之前,却不会对新的客户端做出响应,这种类型的服务器称为“迭代服务器",迭代服务器是按照顺序处理客户端请求,也就是服务端必 \须要处理完前一个请求才能对下一个客户端的请求进行响应, 而Java提供的多线程技术刚好满足这个需求,这个机制使得服务器能够方便处理多个客户 端的请求

2.TCP 协议的通信过程

对于TCP通信来说,每个 TCP Socket 的内核中都有一个 发送缓冲区和一个接收缓冲区,TCP 的全双工的工作模式及TCP 的滑动窗口就是依赖于这两个独立的 Buffer 和该 Buffer的填充状态

接收缓冲区把数据缓存到内核,若应用进程一直没有调用 Socket 的 read 方法进行读取,那么该数据会一直被缓存在接收缓冲区内。不管进程是否读取Socket,对端发来的数据都会经过内核接收并缓存到 Socket 的内核接收缓冲区。

read所要做的工作,就是把内核接收缓冲区中的数据复制到应用层用户的Buffer里
进程调用Socket的send发送数据的时候,一般情况下是将数据从应用层用户的 Buffer 里复制到 Socket 的内核发送缓冲区,然后send就会在上层返回。换句话说,send返 回时,数据不一定会被发送到对端。

Socket 的接收缓冲区被 TCP 用来缓存网络上收到的数据, 一直保存到应用进程读走为止。如果应用进程一直没有读 取,那么Buffer满了以后,出现的情况是:通知对端TCP 协议中的窗口关闭,保证TCP接收缓冲区不会移除,保证 了TCP是可靠传输的。如果对方无视窗口大小发出了超过 窗口大小的数据,那么接收方会把这些数据丢弃

3.如何使用非阻塞提高性能?

非阻塞要解决的就是I/O线程与Socket解耦的问题, 因 此,它引入了事件机制来达到解耦的目的。我们可以认为NIO底层中存在一个I/O调度线程,它不断的扫描每个 Socket的缓冲区,当发现写入缓冲区为空的时候,它会产生一个Socket可写事件,此时程序就可以把数据写入到Socket中如果一次写不完,就等待下一次的可写事 件通知;反之,当发现缓冲区里有数据的时候,它会产生 一个Socket可读事件,程序收到这个通知事件就可以从 Socket读取数据了

4.关于nio

实际上基于上面讲的传统的BIO模型,一个请求一个线程的方式,如果要涉及到上千个客户端访问时,会产生很多的问题, 比如扩展性、系统资源开销等等。所以我们需要一种方法来轮询一组客户端,来查找哪个连接需要提供服 务,这个就是我们的NIO

  • 缓冲区
    在NIO中,所有数据都是用缓冲区处理,在读取数据的时 候,它是直接读到缓冲区中,在写如数据的时候,也是写到缓冲区。任何时候访问NIO中的数据,都是通过缓冲区进行的操作
  • 通道
    Channel 通道,就像一个自来水管一样,可以通过它读取和写入数据,Channel是全双工的,所以数据是双向流
  • 多路复用
    多路复用器Selector,是NIO的基础,多路复用器提供选择已经就绪的任务的能力,简单来说,`Selector 会不断轮询注册上的Channel,如果某个Channel上 面有新的TCP 连接接入、读、写事件,这个 Channel 就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪的Channel进行I/O操作;一个多路复用器可以同时 轮询多个 Channel。通过这个机制可以接入成千上万的客户端
    image.png

第四节组播协议 Multicast

对于某些信息,多个接受者都可能感兴趣的时候,那么我 们应该怎么解决呢?我们可以向每个接受者单播一个数据 副本,但是如果这样的话,效率会低;而且同样的数据发 送多次,浪费带宽。 解决方案是,我们可以把复制数据包的工作交给网络来做, 而不是由发送者负责。这样无论是多少客户端,都没问题 有两种分发类型,广播(broadcast)和多播(multicast);

  • 广播广播是主机向子网内所有主机发送消息,子网内所有主机都能收到来自某台主机的广播信息,属于点对所有点的通信。广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐意接收该数据包;

    image.png

  • 多播多播是主机向一组主机发送信息,存在于某个组的所有主机都可以接收到消息,属于点对多点的通信。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • 1、TCP为什么需要3次握手,4次断开? “三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端...
    杰伦哎呦哎呦阅读 3,475评论 0 6
  • 本文主要通过整理网络上的资料,整理出的关于TCP方面的简单理论知识。作为Java程序员虽然更多的时候我们都是直接调...
    tomas家的小拨浪鼓阅读 5,537评论 1 100
  • 传输层提供的服务 传输层的功能 从通信和信息处理的角度看 ,传输层向它上面的应用层提供通信服务,它属于面向通信部分...
    CodeKing2017阅读 3,616评论 1 9
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,053评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,051评论 0 8