程序员修神之路--简约而不简单的分布式通信基石

点击“蓝字”关注,领取架构书籍

菜菜哥,请教一个问题呗

面试又被卡住了?

还是你了解我呀,tcp协议面向连接是怎么回事呢?

这个说详细起来,那本好几百页的tcp协议的书籍你倒是可以看看

分布式系统可以总结为是处于不同物理位置的多个进程组成的整体,为了确保这个整体有效并且高效的对外提供服务,每个节点之间都有可能需要进行通信来交换信息,而这个交换信息的过程多数使用的是tcp协议。tcp协议是位于ip层之上的传输层协议,在这个传输层里有两个比较重要的协议:tcp和udp。对于应用层的开发人员来说,用的最多的就是这两个协议,这也是一些面试官必问的知识点之一

无论是tcp还是udp,都是建立在ip+端口的规则之上,什么意思呢?也就是说采用tcp和udp的进程都需要一个端口来读取和写入数据。

01

PART

TCP协议

tcp协议是可靠的协议,而且是面向连接的,建立连接的过程会经过三次握手。为什么会是三次握手而不是二次或者四次呢?

说到这个问题,可以抽象出一个场景,怎么样才能确定一端是和另外一端互通的呢?其实很简单,一端发送给另一端的消息能顺利给我答复,这就说明两端是联通的。tcp协议的三次握手恰好说明了这一点,A和B通信,只要三次握手,A能得到B的答复,B也能得到A的答复。

基于ip层发送的报文,在网络中是无法确定是否正确到达对方的。tcp协议在ip协议之上添加了一系列数据结构和算法来保证tcp的数据正确到达。

1. tcp的数据包是有编号的,这么做主要是为了解决顺序问题,如果没有编号,对方怎么确定顺序呢?另外一点,编号是为了发送方来确认哪些包已经正确到达对方

2. 当tcp的数据包被接收方接收,接收方需要发送确认包给发送方,发送方在接收到确认包之后会把对应的数据包做状态修改,由于每个数据包其实有超时机制,在超时之后,发送方会进行重试

3. tcp是面向字节流的,发送的时候发的是一个字节流,这是tcp自己的状态维护的事情。

说了这么多,其实可以把tcp看做是一个有状态的协议,它可以根据网络状况,对方接收情况等诸多因素来调整自己的发送状态。

02

PART

UPP协议

相对于tcp协议来说,udp要简单很多

1. udp协议不需要建立连接,这就意味着发送方只要知道对方的ip和端口,就可以发送,基于这一点可以做广播。

2.udp协议不负责可靠交付,因为它不像tcp协议那样有一堆的算法和数据结构来做保证。 

3. udp是基于数据报形式的,一个一个的发,一个一个的接收。而且udp数据的发送不会根据因为网络环境的阻塞而改变

udp基于以上特性可以在网络环境比较好或者对于丢包不敏感的应用中使用。udp在舍弃了重传,顺序等一些列特性之后,处理速度特别快,在一些不敏感但是实时性要求比较高的场景中应用非常广泛。

03

PART

Socket

在有了tcp和udp协议之后,进程间通信的基石就有了。但是总不能每次通信自己都需要写tcp的三次握手等这些复杂过程吧。为了屏蔽这些复杂的过程,使通信程序简单,在tcp和udp协议之上,便抽象出来了socket这个概念。

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口

socket是区分服务端和客户端的,本地的socket与远程的一个socket建立连接的过程,其实就是tcp协议三次握手的过程。一旦socket连接建立,就可以利用socket抽象出来的read或者write方法来进行通信了。

socket需要指定使用的IP协议,还需要指定使用的是tcp还是udp协议。基于tcp协议的服务端的socket需要bind一个端口来listen并且accept客户端的socket连接。这也是服务端socket和客户端socket的一个区别。

对于udp来说,过程有点不一样。udp是没有连接的,一是不需要三次握手,二是不需要listen和connect,但是仍然需要ip和端口bind,要不然远端的数据到来的时候,系统会找不到接收程序的。UDP是没有连接状态的,因而不需要每次连接都建立一组Socket,而是只用一个Socket,就能够和多个客户端通信。也正是因为没有连接状态,每次通信的时候,调用sendto和recvfrom,都需要传入 IP 地址和端口。

基于tcp的socket在内核中都有一个发送缓冲区和接收缓冲区,tcp的双工工作模式以及tcp的滑动窗口就是依赖于这两个独立的buffer以及buffer的数据填充状态。接收缓冲区把数据缓存入内核之中,如果对应的应用一直没有调用socket的read方法进行数据读取,则此数据会一直被缓存在接收缓冲区中,如果接收缓冲区满了,便会通知对方socket,以调整对方socket的发送窗口大小,这就是滑动窗口的实现。如果对方仍然持续发送数据,接收方在接收缓冲区没有被读取的情况下将丢弃后到的数据,这就是tcp的流量控制。对于udp来说,它没有真正的发送缓冲区,只要有数据就会发送,无论对方能否正常正确接收,这也是udp丢包的原因之一,但是udp的socket 和tcp的socket一样都会有接收缓冲区,而且行为也一样。

04

PART

写在最后

有的面试官吹水,号称http长连接,这个说法其实是不准确的,长连接和短连接是针对tcp协议而言,http只是建立在tcp/ip协议之上的应用层的一个协议。总体而言,tcp和udp设计的数据结构和算法有很多,这里只是粗略的说了一下,有兴趣的同学可以去研究tcp协议那本书。

●程序员修神之路--为什么我会了SOA,你们还要逼我学微服务?

●程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁

●程序员修神之路--设计一套RPC框架并非易事

●程序员过关斩将--要想获取我的用户信息,就得按照规矩来

●程序员过关斩将--更加优雅的Token认证方式JWT

●程序员过关斩将--cookie和session的关系其实很简单

●程序员修神之路--用NOSql给高并发系统加速

●程序员修神之路--高并发系统设计负载均衡架构

●程序员过关斩将--你为什么还在用存储过程?

●程序员修神之路--问世间异步为何物?

●程序员修神之路--提高网站的吞吐

长按添加菜菜好友

关注后回复:“大礼包”和“福利”,领取惊喜

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Spring5]IOC容器_Bean管理XML方式_外部属性文件

IOC操作Bean管理&#xff08;外部属性文件&#xff09; 1.直接配置数据库信息 &#xff08;1&#xff09;配置德鲁伊druid连接池 &#xff08;2&#xff09;引入德鲁伊druid连接池依赖jar包 <!--直接配置连接池--><bean id "dataSource" class "c…

[Spring5]IOC容器_Bean管理注解方式_创建对象

IOC操心Bean管理&#xff08;基于注解方式&#xff09; 1.什么是注解 &#xff08;1&#xff09;注解是代码特殊标记&#xff0c;格式&#xff1a;注解名称(属性名称属性值,属性名称属性值…) &#xff08;2&#xff09;使用注解&#xff0c;注解作用在类上面&#xff0c;方…

一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗

一&#xff1a;背景1. 讲故事最近因为各方面原因换了一份工作&#xff0c;去了一家主营物联柜的公司&#xff0c;有意思的是物联柜上的终端是用 wpf 写的&#xff0c;代码也算是年久失修&#xff0c;感觉技术债还是蛮重的&#xff0c;前几天在调试一个bug的时候&#xff0c;看到…

[Spring5]IOC容器_Bean管理注解方式_组件扫描配置细节

开启组件扫描细节配置 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springf…

一文说通C#中的异步编程

天天写&#xff0c;不一定就明白。又及&#xff0c;前两天看了一个关于同步方法中调用异步方法的文章&#xff0c;里面有些概念不太正确&#xff0c;所以整理了这个文章。一、同步和异步。先说同步。同步概念大家都很熟悉。在异步概念出来之前&#xff0c;我们的代码都是按同步…

[Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value

基于注解方式实现属性注入 &#xff08;1&#xff09;AutoWired&#xff1a;根据属性类型进行自动装配 第一步 把service和dao对象创建&#xff0c;在service和dao类添加创建对象注解 第二步 在service注入dao对象&#xff0c;在service类添加dao类型属性&#xff0c;在属性…

.Net Core in Docker极简入门(上篇)

点击上方蓝字"小黑在哪里"关注我吧环境准备Docker基础概念Docker基础命令Docker命令实践构建Docker镜像Dockerfilebulid & run前言Docker 是一个开源的应用容器引擎&#xff0c;它十分火热&#xff0c;如今几乎成为了后端开发人员必须掌握的一项技能。即使你在生…

ASP.NET Core中的内存缓存

ASP.NET Core中的内存中缓存让我们看看如何通过缓存优化ASP.NET Core应用程序性能我相信&#xff0c;在我们的工作中&#xff0c;每个人都收到来自客户的请求或来自我们应用程序用户的反馈&#xff0c;以提高响应速度。如果在编写代码时仅使用最佳实践还不够&#xff0c;那么我…

[Spring5]IOC容器_Bean管理注解方式_完全注解开发

完全注解开发 &#xff08;1&#xff09;创建配置类&#xff0c;替代xml配置文件 package com.atguigu.spring.config;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;Configuration //作为配置…

ASP.NET Core在 .NET 5 Preview 7的更新

.NET 5 Preview 7现在可以用了&#xff0c;可以进行评估了。这是此版本中的新增功能&#xff1a;Blazor WebAssembly应用程序现在针对.NET 5更新了Blazor WebAssembly的调试要求Blazor的可访问性改进Blazor的性能改进证书认证性能改进发送HTTP/2 PING帧支持Kestrel套接字传输中…

[Spring5]AOP底层原理

AOP底层原理 1.AOP底层使用动态代理 &#xff08;1&#xff09;有两种情况动态代理 第一种 有接口的情况&#xff0c;使用JDK动态代理 a.创建接口实现类代理对象&#xff0c;增强类的方法 第二种 没有接口的情况&#xff0c;使用CGLIB动态代理 a.创建子类的代理对象&#…

Hangfire定时触发作业,好像很简单?

【导读】本节我们继续稍微详细讲讲在我没有详细了解源码的前提下来探讨通过Hangfire定时触发作业有哪些需要注意的事项间隔时间内执行作业举个栗子&#xff0c;每隔10秒监控系统CPU&#xff0c;若CPU飙高&#xff08;根据实际业务定义百分比&#xff09;则在控制台打印输出&…

[Swagger2]Swagger简介

Swagger简介 前后端分离 前端 -> 前端控制层、视图层 后端 -> 后端控制层、服务层、数据访问层 前后端通过API进行交互 前后端相对独立且松耦合 产生的问题 前后端集成&#xff0c;前端或者后端无法做到“及时协商&#xff0c;尽早解决”&#xff0c;最终导致问题…

五分钟快速搭建Serverless免费邮件服务

1. 引言本文将带你快速基于 Azure Function 和 SendGrid 构建一个免费的Serverless&#xff08;无服务器&#xff09;的邮件发送服务&#xff0c;让你感受下Serverless的强大之处。该服务可以每月免费发送2,5000封&#xff0c;这是完全白嫖啊&#xff0c;感兴趣的&#xff0c;赶…

[Swagger2]SpringBoot集成Swagger

SpringBoot集成Swagger 引入依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</…

IdentityServer4 4.x版本 配置Scope的正确姿势

点击上方蓝字"小黑在哪里"关注我吧前言IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证的框架IdentityServer4官方文档&#xff1a;https://identityserver4.readthedocs.io/看这篇文章前默认你对IdentityServer4 已经有一…

[Swagger2]配置Swagger

配置Swaggr 1、Swagger实例Bean是Docket&#xff0c;所以通过配置Docket实例来配置Swaggger。 package com.xxxx.swagger2.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.doc…

.Net Core微服务入门全纪录(完结)——Ocelot与Swagger

点击上方蓝字"小黑在哪里"关注我吧前言上一篇【.Net Core微服务入门全纪录&#xff08;八&#xff09;——Docker Compose与容器网络】完成了docker-compose.yml文件的编写&#xff0c;最后使用docker compose的一个up指令即可在docker中运行整个复杂的环境。本篇简单…

[Swagger2]Swaggr配置扫描接口配置Swagger开关

Swagger配置扫描接口 1、构建Docket时通过select()方法配置怎么扫描接口。 Bean public Docket docket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()// 通过.select()方法&#xff0c;去配置扫描接口,RequestHandlerSelectors配置如何扫描…

最全.Net学习资料库上线,今日可免费下载各类资源!(附百度云链接)

送资料送资料1 适合学习者&#xff1a;0-10年.Net开发人员2 更新时间&#xff1a;2020年7月24日3 在哪领取&#xff1a;文末扫码免费领取4 包含课程&#xff1a;零基础就业必修/高级开发必修/架构师必修5 配套资料&#xff1a;视频配套源码/最新面试题合集/最新技术书/安装包你…