宁夏网站建设一条龙,景区网站开发,科技发展给我们的生活带来的变化,大连网站建设求职简历点击“蓝字”关注#xff0c;领取架构书籍菜菜哥#xff0c;请教一个问题呗面试又被卡住了#xff1f;还是你了解我呀#xff0c;tcp协议面向连接是怎么回事呢#xff1f;这个说详细起来#xff0c;那本好几百页的tcp协议的书籍你倒是可以看看分布式系统可以总结为是处于… 点击“蓝字”关注领取架构书籍菜菜哥请教一个问题呗面试又被卡住了还是你了解我呀tcp协议面向连接是怎么回事呢这个说详细起来那本好几百页的tcp协议的书籍你倒是可以看看分布式系统可以总结为是处于不同物理位置的多个进程组成的整体为了确保这个整体有效并且高效的对外提供服务每个节点之间都有可能需要进行通信来交换信息而这个交换信息的过程多数使用的是tcp协议。tcp协议是位于ip层之上的传输层协议在这个传输层里有两个比较重要的协议tcp和udp。对于应用层的开发人员来说用的最多的就是这两个协议这也是一些面试官必问的知识点之一无论是tcp还是udp都是建立在ip端口的规则之上什么意思呢也就是说采用tcp和udp的进程都需要一个端口来读取和写入数据。01PARTTCP协议tcp协议是可靠的协议而且是面向连接的建立连接的过程会经过三次握手。为什么会是三次握手而不是二次或者四次呢说到这个问题可以抽象出一个场景怎么样才能确定一端是和另外一端互通的呢其实很简单一端发送给另一端的消息能顺利给我答复这就说明两端是联通的。tcp协议的三次握手恰好说明了这一点A和B通信只要三次握手A能得到B的答复B也能得到A的答复。基于ip层发送的报文在网络中是无法确定是否正确到达对方的。tcp协议在ip协议之上添加了一系列数据结构和算法来保证tcp的数据正确到达。1. tcp的数据包是有编号的这么做主要是为了解决顺序问题如果没有编号对方怎么确定顺序呢另外一点编号是为了发送方来确认哪些包已经正确到达对方2. 当tcp的数据包被接收方接收接收方需要发送确认包给发送方发送方在接收到确认包之后会把对应的数据包做状态修改由于每个数据包其实有超时机制在超时之后发送方会进行重试3. tcp是面向字节流的发送的时候发的是一个字节流这是tcp自己的状态维护的事情。说了这么多其实可以把tcp看做是一个有状态的协议它可以根据网络状况对方接收情况等诸多因素来调整自己的发送状态。02PARTUPP协议相对于tcp协议来说udp要简单很多1. udp协议不需要建立连接这就意味着发送方只要知道对方的ip和端口就可以发送基于这一点可以做广播。2.udp协议不负责可靠交付因为它不像tcp协议那样有一堆的算法和数据结构来做保证。 3. udp是基于数据报形式的一个一个的发一个一个的接收。而且udp数据的发送不会根据因为网络环境的阻塞而改变udp基于以上特性可以在网络环境比较好或者对于丢包不敏感的应用中使用。udp在舍弃了重传顺序等一些列特性之后处理速度特别快在一些不敏感但是实时性要求比较高的场景中应用非常广泛。03PARTSocket在有了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一样都会有接收缓冲区而且行为也一样。04PART写在最后有的面试官吹水号称http长连接这个说法其实是不准确的长连接和短连接是针对tcp协议而言http只是建立在tcp/ip协议之上的应用层的一个协议。总体而言tcp和udp设计的数据结构和算法有很多这里只是粗略的说了一下有兴趣的同学可以去研究tcp协议那本书。●程序员修神之路--为什么我会了SOA你们还要逼我学微服务●程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁●程序员修神之路--设计一套RPC框架并非易事●程序员过关斩将--要想获取我的用户信息就得按照规矩来●程序员过关斩将--更加优雅的Token认证方式JWT●程序员过关斩将--cookie和session的关系其实很简单●程序员修神之路--用NOSql给高并发系统加速●程序员修神之路--高并发系统设计负载均衡架构●程序员过关斩将--你为什么还在用存储过程●程序员修神之路--问世间异步为何物●程序员修神之路--提高网站的吞吐长按添加菜菜好友关注后回复“大礼包”和“福利”领取惊喜