网络协议 订阅
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。例如,网络中一个微机用户和一个大型主机的操作员进行通信,由于这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识。为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。当然,对于不相容终端,除了需变换字符集字符外还需转换其他特性,如显示格式、行长、行数、屏幕滚动方式等也需作相应的变换。 [1] 展开全文
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。例如,网络中一个微机用户和一个大型主机的操作员进行通信,由于这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识。为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。当然,对于不相容终端,除了需变换字符集字符外还需转换其他特性,如显示格式、行长、行数、屏幕滚动方式等也需作相应的变换。 [1]
信息
目    的
使两个进程相互通信
解    释
描述进程之间信息交换数据
外文名
Network Protocol
中文名
网络协议
性    质
网络术语
网络协议术语简介
网络协议指的是计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合。对等实体通常是指计算机网络体系结构中处于相同层次的信息单元。一般系统网络协议包括五个部分:通信环境,传输服务,词汇表,信息的编码格式,时序、规则和过程。1969年美国国防部建立最早的网络——阿帕计算机网络时,发布了一组计算机通信协议的军用标准,它包括了五个协议,习惯上以其中的TCP和IP两个协议作为这组协议的通称。 TCP/IP是因特网的正式网络协议,是一组在许多独立主机系统之间提供互联功能的协议,规范因特网上所有计算机互联时的传输、解释、执行、互操作,解决计算机系统的互联、互通、操作性,是被公认的网络通信协议的国际工业标准。TCP/IP是分组交换协议,信息被分成多个分组在网上传输,到达接收方后再把这些分组重新组合成原来的信息。除TCP/IP外,常用的网络协议还有PPP、SLIP等。 [2] 
收起全文
精华内容
参与话题
问答
  • 网络协议、socket、webSocket

    万次阅读 多人点赞 2019-07-31 19:20:28
    一、网络协议 网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。 1、OSI七层协议 OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,从上到下分别...

    一、网络协议

    网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

    1、OSI七层协议

    OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层。

    下面的图表显示不同的协议在最初OSI模型中的位置:

    7 应用层 例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP

    6 表示层 例如XDR、ASN.1、SMB、AFP、NCP

    5 会话层 例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD sockets

    4 传输层 例如TCP、UDP、RTP、SCTP、SPX、ATP、IL

    3 网络层 例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25

    2 数据链路层 例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP

    1 物理层 例如线路、无线电、光纤、信鸽

    2、TCP/IP协议组

    TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何在它们之间传输的标准,从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中。

    应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

    传输层:TCP,UDP

    网络层:IP,ICMP,OSPF,EIGRP,IGMP

    数据链路层:SLIP,CSLIP,PPP,MTU

    3、OSI七层和TCP/IP四层的关系

    3.1 OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。

    3.2 OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。

    3.3 OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。

    3.4 OSI的应用层、表示层、会话层可以算到TCP/IP的应用层里。

    4、总结

    每一抽象层建立在低一层提供的服务上,并且为高一层提供服务。

    通过上述介绍,就可以搞清楚例如HTTP协议和TCP协议的区别之类的问题了。TPC协议是一种传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议,主要解决如何包装数据。关于TCP和HTTP协议的关系,网上有一段比较容易理解的介绍:“我们在传输数据时,可以直接使用(传输层)TCP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议作为应用层协议,以封装HTTP文本信息,然后使用TCP作为传输层协议将它发到网络上。”

    TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

    UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ登陆采用TCP协议和HTTP协议,你和好友之间发送消息时主要采用UDP协议发消息,因此有时会出现收不到消息的情况。

     

    二、socket

    我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。socket是一组接口,在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。

     

    三、webSocket

    1、简介

    WebSocket协议是基于TCP的一种新的网络协议,和http协议一样属于应用层协议,它实现了浏览器与服务器全双工(full-duplex)通信,也就是允许服务器主动发送信息给客户端。我在实现二维码扫描登录时曾使用过,有了它就不需要通过轮询或者建立长连接的方式来使客户端实时获取扫码状态,因为当扫码后,服务器端可以主动发送消息通知客户端。

    2、webSocket和http的区别

    http链接分为短链接和长链接,短链接是每次请求都要重新建立TCP链接,TCP又要三次握手才能建立,然后发送自己的信息。即每一个request对应一个response。长链接是在一定的期限内保持TCP连接不断开。客户端与服务器通信,必须要由客户端发起然后服务器返回结果。客户端是主动的,服务器是被动的。

    简单的说,WebSocket协议之前,双工通信是通过多个http链接轮询来实现的,这导致了效率低下。WebSocket解决了这个问题,他实现了多路复用,他是全双工通信。在webSocket协议下客服端和浏览器可以同时发送信息。建立了WebSocket之后服务器不必在浏览器发送request请求之后才能发送信息到浏览器。这时的服务器已有主动权想什么时候发就可以什么时候发送信息到客户端,而且信息当中不必再带有head的部分信息了。与http的长链接通信来比,这种方式不仅能降低服务器的压力,而且信息当中也减少了部分多余的信息。

    3、webSocket和socket的区别

    就像Java和JavaScript,并没有什么太大的关系,但又不能说完全没关系。可以这么说:

    • 命名方面,Socket是一个深入人心的概念,WebSocket借用了这一概念;
    • 使用方面,完全两个东西。

    总之,可以把WebSocket想象成HTTP,HTTP和Socket什么关系,WebSocket和Socket就是什么关系。

    最后附上一张有意思的图片:

     

    展开全文
  • 计算机网络协议——通信协议综述

    万次阅读 多人点赞 2019-09-03 23:20:58
    通信协议综述概述一、为什么学习网络协议1.1 常见的网络协议二、网络分层的真正含义2.1 为什么网络要分层?2.2 浏览点击请求过程2.3 揭秘层与层之间的关系三、ifconfig 命令行的由来3.1 ip地址3.2 无类型域间选路...

    这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,绝对物超所值,本文就是对自己学习专栏的总结,评论区可以留下你的问题,咱们一起讨论!


    概述

    本文也是根据专栏里的板块,对通信网络协议做一个综述,共分为四节去进行介绍;

    • 为什么学习网络协议?
    • 网络协议分层的真正含义;
    • ifconfig命令行的背后;
    • DHCP和PXE:ip的由来;

    一、为什么学习网络协议

    协议

    协议的三要素是:语法、语义、顺序
    连通互联网世界,只教给一台电脑做什么是不够的,需要教会一大片机器做什么,这就是网络协议。只有通过网络协议,才能够使得一大片机器互相协作、共同完成一件事。

    1.1 常见的网络协议

    采用一个下单购物的场景,看看整个过程运用了哪些网络协议。


    首先,在浏览器中输入一个网址www.taobao.com URL,浏览器只知道名字是www.taobao.com,但是不知道具体的地点,所以不知道该如何访问;

    于是,打开地址簿去查找,可以使用一般的地址簿DNS去查找,也可以采用更为精确的地址簿查找协议HTTPDNS

    无论哪一种查找,最后都会得到一个地址:106.114.134.24(任意赋值),这个是IP地址,相当于你在互联网世界中的“门牌号”。知道了目标地址,浏览器开始打包他们的请求。对于普通的浏览请求,往往会采用HTTP协议;但是对于购物的请求,往往需要进行加密传输,因而使用HTTPS协议。无论是什么协议,里面都会声明“你要买什么和买多少”。HTTP头中包含了请求的信息:

    HTTP
    DNS、HTTP、HTTPS所在的层为应用层;


    经过封装以后,浏览器会将应用层的包交给下一层去完成,然后通过socket编程来实现。下一层是传输层,传输层有两种协议:

    • 无连接的协议UDP
    • 面向连接的协议TCP

    对于支付来说,往往采用TCP协议,所谓的面向连接就是,TCP会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达;TCP协议中有两个端口,一个是浏览器监听的端口,一个是电商服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程;
    TCP协议


    传输层封装完之后,浏览器会将包交给操作系统的网络层。网络层的协议是IP协议,在IP协议里面会有源IP地址,即浏览器的所在的机器的IP地址和目标IP地址,也就是电商所在的IP地址
    IP地址
    目标IP就是电商地址的门牌号,操作系统知道了目的地的门牌号,就要想着该如何找到目的地;

    首先先判断,目的地是在本地还是在外地;电商系统一般都在那遥远的地方,就比如你到国外要去海关一样,去外地就要经过网关。操作系统启动以后,就会被DHCP协议配置IP地址,以及默认的网关IP地址192.168.1.1;

    如果是本地通信就是靠吼——ARP协议,操作系统大吼一声,谁是192.168.1.1啊?网关会回答它,我就是。这个本地地址就是MAC地址,吼靠的就是ARP协议;

    IP包

    于是操作系统将IP包交给了下一层,也就是MAC层。网卡再将包发出去,包里面包含MAC地址,因此可以到达网关。网关收到包以后,会根据自己的知识,判断下一步该怎么走。网关往往是一个路由器,到了某个IP地址应该怎么走,这个叫作路由表

    路由器就像唐僧西天取经路过的一个个国家之间的城关,每个城关都连接着两个国家,每一个国家都相当于一个局域网,每个国家的内部都可以使用MAC地址进行通信;

    一旦跨越城关,就需要拿出IP头来,里面记录着IP源地址(东土大唐),欲前往西天拜佛取经(目的IP地址),路过宝地,借宿一晚,请问接下来该如何走?
    在这里插入图片描述
    城关与城关之间的沟通协议叫做路由协议,常用的由OSPF和BGP

    城关与城关之间是一个国家,网络包知道了要去哪个城关的时候,还是要使用国家内部的MAC地址,通过下一个城关的MAC地址,找到下一个城关,然后在问下一步该怎么走,一直走到最后一个城关。最后一个城关知道这个网络包要去的地方。于是,对着这个国家吼一声,谁是目标IP啊?目标服务器就会回复一个MAC地址。网络包过关后,通过这个MAC地址就能找到目标服务器;


    目标服务器发现MAC地址对上了以后,取下MAC头来,发送给操作系统的网络层,发现IP地址对上了,在取下IP头。IP头里会写上一层封装的TCP协议,然后交给传输层,即TCP层

    在这一层中,对于收到的每个包,都会有一个回复说明收到了。这个回复的包绝非这次单次请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是TCP层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安,防止在传输过程中造成的丢包等。

    如果过一段时间还没有收到的话,发的端TCP层会重新发送这个包,还是上面的请求,直到收到平安到达的回复。这个重试绝非你的浏览器重新将下单这个动作重新请求一次。对于浏览器来讲,就发送了一次下单请求,TCP层不断自己闷头重试。除非TCP这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。

    当网络包平安到达TCP层之后,TCP头中有目标端口号,通过这个端口号,可以找到电商网站的进程正在监听这个端口号,假设一个Tomcat,将这个包发给电商网站。

    电商网站的进程得到的是HTTP请求知道要买什么东西,买多少。往往一个电商网站最初接待请求的这个Tomcat只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。

    如何告诉相关的进程呢?往往通过RPC调用,即远程过程调用的方式来实现。远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互连问题,会由RPC框架统一处理。RPC框架有很多种,有基于HTTP协议放在HTTP的报文里面的,有直接封装在TCP报文里面的。

    当接待员发现相应的部门都处理完毕,就回复一个HTTPS的包,告知下单成功。这个HTTPS的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功;

    看到这里相信你对于自己之前学过的计算机网络知识有一个连串的感觉了吧,很多公司的面试题都会问在浏览器中输入一个URL的整个过程? 把这一连串说完,相信你的面试官也会觉得你学的很扎实;
    网络协议

    二、网络分层的真正含义

    计算机网络知识点需要背诵,但是更是要理解透彻;

    2.1 为什么网络要分层?

    因为不同层次之间有不同的沟通方式,叫做协议。就像一家公司也是分“层次”,分为总经理、经理、组长、员工,每个人之间都有不同的沟通方式;

    因为复杂的程序都要分层,想象网络包就是一段Buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。你想象自己有很多的网口,从某个口拿进一个网络包来,用自己的程序处理一下,再从另一个网口发送出去;

    当然网络包的格式很复杂,这个程序也很复杂,复杂的程序都要分层,这是程序设计的要求。

    2.2 浏览点击请求过程

    浏览点击请求过程如下所示:
    在这里插入图片描述
    在这里插入图片描述
    假设你发现这个包的MAC地址和你的相符,那说明就是发给你的,于是需要调用process_layer3(buffer):这个时候,Buffer里面往往就没有二层的头了,因为已经在上一个函数的处理过程中拿掉了,或者将开始的偏移量移动了一下。在这个函数里面,摘掉三层的头,看看到底是发送给自己的,还是希望自己转发出去的;

    如果IP地址不是自己的,那就应该转发出去;如果IP地址是自己的,那就是发给自己的。根据IP头里面的标识,拿掉三层的头,进行下一层的处理,到底是调用process_tcp(buffer)呢,还是调用process_udp(buffer)呢?

    假设地址是TCP,就会调用process_tcp(Buffer)。这时候,Buffer里面没有三层的头,就需要查看四层的头,看这是一个发起,还是一个应答,又或者是一个正常的数据包,然后分别由不同的逻辑进行处理。如果是发起或者应答,接下来可能要发送一个回复包;如果是一个正常的数据包,就需要交给上层了。交给谁呢?是不是有**process_http(buffer)**函数呢?

    如果你是一个网络包处理程序,你不需要有process_http(buffer),而是应该交给应用去处理。交给哪个应用呢?在四层的头里面有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听这个端口,那你发给浏览器就行了。至于浏览器怎么处理,和你没有关系;

    浏览器是解析HTML,显示出页面来。当你再次点击鼠标,点击动作被浏览器捕获,于是浏览器知道又会发起另一个HTTP请求了,于是使用端口号,将请求发送给你。

    你应该调用send_tcp(buffer)。不用说,Buffer里面就是HTTP请求的内容。这个函数里面加一个TCP的头,记录下源端口号。浏览器会给你目的端口号,一般为80端口;

    然后调用send_layer3(buffer)。Buffer里面已经有了HTTP的头和内容,以及TCP的头。在这个函数里面加一个IP的头,记录下源IP的地址和目标IP的地址;随后调用send_layer2(buffer),**Buffer里面已经有了HTTP的头和内容、TCP的头,以及IP的头。这个函数里面要加一下MAC的头,记录下源MAC地址,得到的就是本机器的MAC地址和目标的MAC地址。**不过,这个还要看当前知道不知道,知道就直接加上;不知道的话,就要通过一定的协议处理过程,找到MAC地址。反正要填一个,不能空着;

    2.3 揭秘层与层之间的关系

    现实生活中,往往是员工说一句,组长补充两句,然后经理补充两句,最后总经理再补充两句。但是在网络世界,应该是总经理说话,经理补充两句,组长补充两句,员工再补充两句。

    TCP在三次握手时,TCP每一个消息都会带着IP层和MAC层。因为,TCP每次发送一个消息,IP层和MAC层的所有机制都要重新运行一次,所以TCP在三次握手时,IP和MAC也运行了好久。

    只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层;如果一个HTTP协议的包跑在网络上,它一定是完整的。无论这个包经过哪些设备,它都是完整的。所谓的二层设备、三层设备只是跑在设备上的程序不同;

    • 二层设备:只把MAC头摘下来,看看到底是丢弃、转发,还是自己留着;
    • 三层设备:把MAC头摘下来之后,再把IP头摘下来,看看到底是丢弃、转发,还是自己留着;

    三、ifconfig 命令行的由来

    ifconfig是linux系统中查询ip地址的一个命令,windows是ipconfig;

    3.1 ip地址

    IP地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号。
    例如:10.100.122.2就是一个IP地址,地址被分为四个部分,每个部分8个bit,所以IP地址总共是32位;

    IP地址被分成了5类,A-E类
    IP地址
    在网络地址中,A、B、C类主要分为两个部分,前一部分是网络号,后一部分是主机号。大家都是六单元1001号,你是小区A的,我是小区B的;

    ip地址范围

    3.2 无类型域间选路(CIDR)

    无类型域间选路,简称CIDR,将IP地址一分为二,前面是网络号,后面是主机号。10.100.122.2/24,这个IP地址中有一个斜杠,斜杠后面有个数字24,这种地址表示形式,就是CIDR,后面24的意思是,32位中,前24位是网络号,后8位是主机号。

    伴随着CIDR存在的,一个是广播地址,10.100.122.125,如果发送这个地址,所有10.100.122网络内的机器都可以收到,另一个是子网掩码,255.255.255.0

    将子网掩码和IP地址按位计算AND,就可以得到网络号,那么上面的ip地址与子网掩码按位取AND,网络号就是10.100.122.0;(1和任意数值取AND,值不变;0和任意数值取AND,即为0);

    3.3 公有IP地址和私有IP地址

    在这里插入图片描述
    平时我们在办公室、学校、家里的IP地址,一般都是私有IP地址,因为这些地址,允许组织内部的IP地址自己管理、自己分配,因此可以重复。就比如你们学校可能由六单元一号,我们学校可能也有六单元1号。

    但是,一旦离开学校就需要使用公有IP地址,就像上海市南京西路88号,这个是国家同统一分配的。公有IP地址,由相关的组织去分配,如果使用,需要购买。

    192.168.0.x,是最常见的私有IP地址,家里有wifi,对应就有一个ip地址,但是一般家庭中的上网设备不会超过256个,所以/24基本就够用了。

    举例:CIDR中容易犯错的点
    16.158.165.91/22,这个CIDR,求网络中的第一个地址、子网掩码和广播地址
    16.158的部分不会动,它占了前16位。中间的165,变为二进制为‭10100101‬。除了前面的16位,还剩6位。所以,这8位中前6位是网络号,16.158.<101001>,而**<01>.91是机器号**;所以第一个地址是16.158.<101001><00>.1,即16.158.164.1,子网掩码是255.255.<111111><00>.0,即255.255.252.0,广播地址是16.158.<101001><11>.255,即16.158.167.255.

    这五类地址中,还有一类D类是组播地址,使用这一类地址,属于某个组的机器都能够收到,这就有点类似于公司中大家加入了一个邮件组,发送邮件,加入这个组的大家都能收到;

    IP地址的后面有个scope对于eth0这张网卡来讲,是global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于lo来讲,是host,说明这张网卡仅仅可以供本机相互通信;

    lo又被称为loopback,又称环回接口,往往会被分配到127.0.0.1这个地址,这个地址可以用于本机通信,经过内核处理以后直接返回,不会在任何网络中出现;

    3.4 MAC地址

    在IP地址的上一行是link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为MAC地址,是一个网卡的物理地址,用十六进制,6个byte表示。既然已经知道了MAC地址,是不是意味着直接可以通过MAC地址进行通信啊?

    个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的IP地址,才是有远程定位功能的。

    比如:你要去某某大学某某学院找小明,你在路上问,有些人不知道某某学院,但是可以给你说某某学校在哪里,但是你直接根据 小明的身份证号 问别人知不知道他在哪个学院,那么肯定没人知道;

    MAC地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识

    MAC地址是有一定的定位功能的,你可以根据ip地址找到某某学校某某学院某号楼某个实验室,当你到了以后,大吼一声,小明 是哪位,那么他听到了 就会回应你;

    MAC地址的通信范围比较小,局限在一个子网里面。例如,从192.168.0.2/24访问192.168.0.3/24是可以用MAC地址的。一旦跨子网,即从192.168.0.2/24到192.168.1.2/24,MAC地址就不行了,需要IP地址起作用了

    总结:

    • ip是地址,有定位功能;MAC是身份证,无定位功能;
    • CIDR可以用来判断是不是本地人;
    • IP分为公有地址IP和私有地址IP

    四、DHCP和PXE:ip的由来

    只要是在网络上跑的包可以有下层没上层,但是不可以有上层没下层;当一个数据包有自己的ip地址,有目的地的ip地址,但是包发不出去的原因是因为,MAC层还没有填写。

    Linux的默认逻辑是,如果是一个跨网段的调用,它便不会将包直接发送到网络上,而是企图将包发送到网关。网关要和当前的网络至少一个网卡是同一个网段;

    4.1 动态主机配置协议(DHCP)

    动态主机配置协议(Dynamic Host Configuration Protocol),简称DHCP

    有了这个协议,网络管理员就轻松多了。他只需要配置一段共享的IP地址。每一台新接入的机器都通过DHCP协议,来这个共享的IP地址里申请,然后自动配置好就可以了。等人走了,或者用完了,还回去,这样其他的机器也能用。

    如果是数据中心里面的服务器,IP一旦配置好,基本不会变,这就相当于买房自己装修。DHCP的方式就相当于租房。你不用装修,都是帮你配置好的。你暂时用一下,用完退租就可以了。

    4.2 解析DHCP的工作方式

    当一台机器加入一个新的网络的时候,只知道自己的mac地址,先吼一句,有人吗?这一步就是DHCP Discover

    新来的机器使用IP地址0.0.0.0发送了一个广播包,目的IP地址为255.255.255.255。广播包封装了UDP,UDP封装了BOOTP。其实DHCP是BOOTP的增强版,但是如果你去抓包的话,很可能看到的名称还是BOOTP协议;

    在这个广播包里,新人喊一句:我是新来的(Boot request),我的MAC地址是多少,但是我还没有ip地址,谁能给我一个?
    在这里插入图片描述
    网络管理员在网络配置了DHCP server,就相当于IP管理员,MAC地址是其唯一的身份。只有MAC地址唯一,IP管理员才能知道这是一个新人,需要租给它一个新的IP地址,这个过程就是DHCP Offer.

    DHCP Offer格式如下:
    里面会有给新人分配的地址;
    DHCP Offer
    DHCP Server仍然使用广播地址作为目的地址。如果同时收到多个IP地址,那么会选择最先到达的DHCP Offer,并且会向网络发送一个DHCP Request广播数据包,其中包含客户端的MAC地址、接受的租约中的IP地址,提供租约的DHCP服务器地址等,并且告诉所有的DHCP Offer,它将接受哪一台服务器所提供的IP地址,感谢其他DHCP服务器,并且请求撤销他们提供的ip地址,以便提供给下一个租用者。

    在这里插入图片描述
    由于还没有收到DHCP server的最后确认,客户端依然使用自己的源ip地址0.0.0.0、255.255.255.255为目标地址进行广播。在BOOTP里面,接受某个DHCP Server的分配 ip;

    当DHCP Server接收到客户机的DHCP request之后,会广播返回给客户机的一个DHCP ACK消息包,表明已经接受客户机的选择,并且将这一IP地址合法租用信息和其他的配置信息都放到该广播包中,发送给客户机,欢迎它加入网络大家庭;

    在这里插入图片描述
    租约达成以后,还是要广播一下,让大家都知道呢

    ip地址的收回和续租

    如果需要续租的话,需要提前租期的50%,客户机会在租期过去50%的时候,直接向为其提供ip地址的DHCP Server发送DHCP Request消息包,客户机收到该服务器的DHCP ACK消息包之后,会根据包中提供的新的租期,以及其他的已经更新的TCP/IP参数更新自己的配置,这样,ip的租用更新就已经完成了。

    网络管理员不仅能自动分配IP地址,还能帮你自动安装操作系统;

    4.3 预启动执行环境(PXE)

    普通的笔记本一般不会有这种雪球,已经预装好了操作系统。但是数据中心的管理员,可能一下子拿到了几百台空的机器,一台一台装就累死了。

    管理员们不仅希望可以分配好ip地址,还可以自动安装系统,装好系统之后会自动分配IP地址,直接启动最好了。

    安装操作系统的过程,只能插在BIOS启动之后了。因为没安装系统之前,连启动扇区都没有。因而这个过程叫做预启动执行环境(Pre-boot Execution Environment),简称PXE。

    默认的DHCP Server是需要配置的,无非是我们配置IP的时候所需要的IP地址段、子网掩码、网关地址、租期等。如果想使用PXE,则需要配置next-server,指向PXE服务器的地址,另外要配置初始启动文件filename。

    这样PXE客户端启动之后,发送DHCP请求之后,除了能得到一个IP地址,还可以知道PXE服务器在哪里,也可以知道如何从PXE服务器上下载某个文件,去初始化操作系统。

    解析PXE的工作过程

    首先是启动PXE客户端第一步是通过DHCP协议告诉DHCP Server,我啥都没有,DHCP Server便租给它一个ip地址,同时给他PXE服务器的地址、启动文件pexlinux.0;

    其次,PXE客户端知道要去PXE服务器下载这个文件后,就可以初始化机器。于是便开始下载,下载的时候使用的是TFTP协议。所以PXE服务器上,往往还需要有一个TFTP服务器。PXE客户端向TFTP服务器请求下载这个文件,TFTP服务器说好啊,于是就将这个文件传给它;

    然后,PXE客户端收到这个文件后,就开始执行这个文件。这个文件会指示PXE客户端,向TFTP服务器请求计算机的配置信息pxelinux.cfg。TFTP服务器会给PXE客户端一个配置文件,里面会说内核在哪里、initramfs在哪里。PXE客户端会请求这些文件;

    最后,启动Linux内核,一旦启动了操作系统,啥都好办。

    在这里插入图片描述

    总结


    本文是对通信协议综述的总结,共分为四节去介绍:

    1. 为什么学习网络协议?
      通过一个简简单单的下单过程,中间牵扯到这么多的协议,展开介绍;

    2. 网络协议分层的真正含义
      始终想象自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发出去;
      始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层;

    3. ifconfig命令行的背后;
      IP是地址,有定位功能;MAC是身份证,无定位功能;
      CIDR可以用来判断是不是本地人;
      IP分公有的IP和私有的IP。后面的章节中我会谈到“出国门”,就与这个有关。

    4. DHCP和PXE:ip的由来;
      DHCP协议主要是用来给客户租用IP地址,和房产中介很像,要商谈、签约、续租,广播还不能“抢单”;
      DHCP协议能给客户推荐“装修队”PXE,能够安装操作系统,这个在云计算领域大有用处;

    展开全文
  • 网络协议

    千次阅读 2017-09-30 18:06:35
    网络协议:网络为进行数据交换而建立的规则局域网常用的协议: TCP/IP 协议 (目前最流行的协议,没有根本上不了网) NetBEUI IPX/SPX协议 (用来连接玩游戏的) 其中TCP/IP协议包括了上百个互为关联的协议(位于...

    网络协议:网络为进行数据交换而建立的规则

    局域网常用的协议:

    • TCP/IP 协议 (目前最流行的协议,没有根本上不了网)
    • NetBEUI
    • IPX/SPX协议 (用来连接玩游戏的)

    其中TCP/IP协议包括了上百个互为关联的协议(位于传输层)

    • Telnet 提供 远程登录功能
    • FTP 远程文件传输协议
    • SMTP 简单邮政传输协议
    • NFS 网络文件服务器
    • UDP 用户数据包协议,(位于传输层,和IP协议配合使用,在传输数据省去包头,不能提供数据包重传,所以适合传输较短的文件)

    TCP/IP 协议详解

    TCP/IP协议是基本的协议 由网络层的IP协议和传输层的TCP协议组成;该协议采用4层结构

    1. TCP (传输控制协议)
      TCP是面向连接的、可靠的、基于字节流的传输成通信协议

    TCP 头部

    英文版的

    中文版的

    一般情况下 TPC header 的长度是20个字节
    上述两图中需要注意的地方 :

    1. TCP layer 没有IP地址的概念,所以4个字节 是源端口和目的端口
    2. Sequence Number(序号):传输过程中,为每一个封包分配了一个序号保证网路传输数据的顺序性;
    3. Acknowledgment Number(确认号):用来确认收到相关封包,内容表示期望收到下一个报文的序列号,用来解决丢包问题
    4. TCP Flags: 标志数据包的属性,比如SYN,RST,FIN,PSH, URG, ACK,操控TCP的状态机
    5. Windows:滑动窗口,主要用于解决流控拥塞问题
    6. Checksum : 校验值
    7. Urgent Pointer : 紧急指针,可告知紧急的数据位置,需要Flag和U flag 配合使用
    8. TCP options :一般包含三次握手中,有option 选项!

      TCP Flags 解释 :

    9. URG 用来 督促中间层设备要要尽快处理这些数据;

    10. ACK : 表示应答域有效
    11. PSH : 数据包到达接收端以后,立即传送给应用程序,而不是排队等候;
    12. RST : 表示连接复位请求,用来复位那些产生错误的连接;
    13. SYN :用来建立连接
    14. FIN:表示发送端已经达到数据末尾,双方数据传输完成。

    TCP三次握手

    1、第一次握手:建立连接,客户端发送连接请求报文,将 SYN 位置为1,Seq为X,然后客户端等待状态,等待服务器确认;
    2、第二次握手; 服务器收到SYN报文段,对SYN进行确认。设置Acknowledgment Number(确认号)为X+1(seq+1);同时发送自己的SYN信息,将SYN位置为1,seq为y,服务器将信息放在报文段中,发送给客户端,服务器进行进行SYN_RECV状态
    3、第三次握手, 客户端接受到 SYN+ACK 报文段,将Acknowledgment Number确认号设置为y+1 向服务器发送ACK报文段,发送完毕,连接成功

    展开全文
  • 计算机网络协议(三)——UDP、TCP、Socket

    万次阅读 多人点赞 2019-09-04 08:39:53
    这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师的趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,...

    概述


    这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,绝对物超所值,本文就是对自己学习专栏的总结,评论区可以留下你的问题,咱们一起讨论!


    传输层中有两个重要的协议,UDP和TCP,这也是在开发中经常用到的协议,同样也是面试的重点。本篇将分为三节进行介绍:

    • UDP协议
    • TCP协议
    • 套接字Socket

    一、UDP协议

    很多人都会被问到 TCP和UDP的区别,那么大部分人都会回答,TCP面向连接,UDP面向无连接;

    建立连接:是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性;

    简单介绍下TCP和UDP之间的区别:

    • TCP 提供可靠交付,UDP继承了IP包的特性,不保证不丢失,不保证按时到达;
    • TCP是面向字节流的,发送的时候发的是一个流,没头没尾的。UDP继承了IP的特性,基于数据报的,一个个发,一个个收;
    • TCP是可以有拥堵控制的,可以根据网络环境调整自己的行为;UDP就是应用让我发,我就发,管它洪水滔天;
    • TCP是一个有状态的服务,通俗的讲就是有脑子的,可以精确的记着,自己发送了没有,接收到没有,发送到哪个了,应该接收到哪个了,错一点儿都不行;UDP其实是一个无状态服务,无脑子,天真无邪的发出去就发出去呗;

    UDP的包头
    UDP的包头格式很简单,只有源端口号和目标端口号:
    UDP包头


    UDP的三大特点

    • 沟通简单,秉承性善论,相信网络通路默认就是很容易送达的,不容易被丢弃的;
    • 轻信他人,不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给他数据,也可以传给任何人数据;
    • 愣头青,做事不懂权变,不会根据网络的情况进行发包的拥塞控制,无论网络丢包丢成啥样了,它该怎么发还怎么发;

    UDP的三大使用场景

    • 需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用;
    • 不需要一对一沟通,建立连接,而是可以广播的应用;UDP的不面向连接的功能,可以使得可以承载广播或者多播的协议。DHCP就是一种广播的形式,就是基于UDP协议的;
    • 需要处理速度快,时延低,可以容忍少数丢包,即便网络堵塞,也毫不退缩,一往无前的时候;UDP简单、处理速度快,不像TCP一样,操那么多心;TCP在网络不好出现丢包的时候,拥塞控制策略会主动的退缩,降低发送速度,这就相当于本来环境就差,还自断臂膀,用户本来就卡,这下更卡了

    基于UDP的实际应用

    • 网页或者APP的访问,访问网页和手机APP都是基于HTTP协议(基于TCP)的,建立连接需要多次交互,比较耗时,Google提出了QUIC实现快速连接建立、减少重传时延,自适应拥塞控制;
    • 流媒体的协议,直播协议多使用RTMP(基于TCP),当数据丢包或者网络不好,影响直播的实时性,很多直播应用,都基于UDP实现了自己的视频传输协议;
    • 实时游戏,采用自定义的可靠UDP协议,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响;
    • IoT物联网,物联网通信协议Thread,就是基于UDP协议的,解决了物联网领域终端资源少,实时性要求高的问题;
    • 移动通信领域:4G网络里,移动流量上网的数据面对的协议GTP-U是基于UDP的;

    总结:

    • 如果将TCP比作成熟的社会人,UDP则是头脑简单的小朋友;TCP复杂,UDP简单;TCP维护连接,UDP谁都相信;TCP会坚持知进退;UDP铁憨憨一个,勇往直前;
    • UDP简单但有简单的用法。它可以用在环境简单、需要多播、应用层自己控制传输的地方。例如DHCP、VXLAN、QUIC

    二、TCP协议(上)

    TCP秉承的是性恶论,天然认为网络环境是恶劣的,丢包、乱序、重传、拥塞都是常见的事情,需要从算法层面来保证可靠性。


    TCP包头格式
    TCP报文格式

    • 源端口号和目标端口号:知道谁发的和发给谁的;
    • 序号:编号是为了解决乱序问题;
    • 确认序号:发出去的包应该有确认,没有收到就应该重新发送,直到送达;
    • 状态位SYN是发起一个连接、ACK是回复、RST是重新连接、FIN是结束连接;
    • 窗口大小:TCP要做流量控制,通信双方各声明一个窗口,标识自己当前能够的处
      理能力,别发送的太快,撑死我,也别发的太慢,饿死我;

    通过对TCP头的解析,我们知道要掌握TCP协议,重点应该关注以下几个问题:

    • 顺序问题 ,稳重不乱;
    • 丢包问题,承诺靠谱;
    • 连接维护,有始有终;
    • 流量控制,把握分寸;
    • 拥塞控制,知进知退;

    2.1 TCP的三次握手

    TCP中所有的问题,都要先建立连接,需要先看连接维护的问题,TCP的连接建立,常被称为三次握手;

    A:您好B,我是A.
    B:您好A,我是B.
    A:您好B

    采用 请求->应答->应答之应答的方式,保证二者的消息传送都是有来有回的;

    三次握手除了双方建立连接外,主要还是为了沟通一件事情,就是TCP包的序号的问题。 每个连接都要有不同的序号。这个序号的起始序号是随着时间变化的,可以看成一个32位的计数器,每4ms加一,其时序图如下:
    状态变化时序图
    1、刚开始客户端和服务端都处于CLOSED状态,服务端先监听某个端口,处于LISTEN状态

    2、客户端主动发起连接请求SYN=1,ACK=0,初始序号为x,之后处于SYN-SENT状态

    3、服务端收到发起的连接请求,如果同意连接就返回SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y,之后处于SYN-RCVD状态

    4、客户端收到服务端发送的SYN和ACK之后,发送ACK的ACK,确认号为 y+1,序号为 x+1。之后处于ESTABLISHED状态,因为它一发一收成功了;

    5、服务端收到ACK的ACK之后,处于ESTABLISHED状态,因为它也一发一收了。


    两次握手或者四次不行吗?

    举个例子:

    在一个网络环境不可靠的情况下,A发出一个连接请求,发出一个请求杳无音信就会一直发,终于有一个包到B了,但是A还不知道会继续发;

    收到A的请求之后,B如果同意连接就会发送应答包给A;但是B的应答包也是一入网络深似海啊,不知道能不能到A,所以当然不能认为和A已经建立了连接;

    还有一个问题就是,A和B建立起短暂的连接通信之后,A之前发送的请求包饶了地球不知道多少圈竟然又到了B,假如B认为这是一个正常的连接请求,同意建立连接,但这个连接不会进行下去,也没有个终结的时候,纯属单相思了,因而两次握手肯定不行。

    B发送的应答可能会发送多次,但是只要一次到达A,A就认为连接已经建立了,因为对于A来讲,他的消息有去有回。A会给B发送应答之应答,而B也在等这个消息,才能确认连接的建立,只有等到了这个消息,对于B来讲,才算它的消息有去有回。

    当然A发给B的应答之应答也会丢,也会绕路,甚至B挂了。按理来说,还应该有个应答之应答之应答,这样下去就没底了。四次握手、还是四十次握手都是可以的,哪怕四百次握手也不能百分百保证可靠,只要双方的消息都有去有回就可以了。

    我们在程序设计的时候可以开启keepalive机制,防止A建立连接后空着,不发数据;


    2.2 TCP的四次挥手


    过程如下:
    A:B啊,我不想玩了;
    B:哦,你不想玩了啊,我知道;
    此时的A很可能是发送完最后的数据就准备不玩了,不能在ACK的时候就关闭连接,此时B还没有忙完自己的事情,还是可以发送数据的,称为半关闭状态
    B:A啊,好吧,那我也不玩了,拜拜;
    A:好的,拜拜;

    断开连接的时序图如下所示:

    在这里插入图片描述
    双方一开始都是处于建立连接的状态:

    • A 发送连接释放报文,FIN=1,就进入FIN_WAIT_1的状态;
    • B 收到之后发出确认,此时 TCP 属于CLOSE_WAIT(半关闭)状态,B 能向 A 发送数据但是 A 不能向 B 发送数据;
    • 当 B 不再需要连接时,发送连接释放报文,FIN=1就进入FIN_WAIT_2的状态
    • A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接;
    • B 收到 A 的确认后释放连接;

    四次挥手的原因

    客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

    TIME_WAIT

    客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

    • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A
      等待一段时间就是为了处理这种情况的发生。
    • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

    2.3 TCP状态机

    加黑加粗的部分,是上面说到的主要流程,其中阿拉伯数字的序号,是连接过程中的顺
    序,而大写中文数字的序号,是连接断开过程中的顺序。加粗的实线是客户端A的状态变迁,加粗的虚线是服务端B的状态变迁;
    TCP状态机


    三、TCP协议(下)

    参考了CS-Notes的博文,总结的很好!

    TCP传输是可靠的,需要很多机制保证传输的可靠性,里面也要有恒心,就是各种重传的策略;还需要有智慧,里面包含着大量的算法


    如何成为一个靠谱的协议?
    TCP中为了保证顺序性,每一个包都有一个ID;建立连接的时候,会商定起始的ID是什么,然后按照ID一个个发送。采用**累计确认或者累计应答(cumulative acknowledgment)**的方式去保证不丢包;

    为了记录所有发送的包和接收的包,TCP也需要发送端和接收端分别都有缓存来保存这些记录。发送端的缓存里是按照包的ID一个个排列,根据处理的情况分成四个部分:

    • 发送了并且已经确认的;
    • 发送了并且尚未确认的;
    • 没有发送,但是已经等待发送的;
    • 没有发送,并且暂时还不会发送的;

    3.1 可靠传输

    TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。

    一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT加权平均往返时间 RTTs 计算如下:
    Alt

    其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。

    超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:

    在这里插入图片描述

    其中 RTTd 为偏差的加权平均值


    3.2 TCP滑动窗口

    窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

    发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

    接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
    在这里插入图片描述

    3.3 TCP 流量控制

    流量控制是为了控制发送方发送速率,保证接收方来得及接收。

    接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

    3.4 TCP 拥塞控制

    如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度
    在这里插入图片描述
    TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复

    发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。

    为了便于讨论,做如下假设:

    • 接收方有足够大的接收缓存,因此不会发生流量控制;
    • 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。

    在这里插入图片描述

    3.4.1 慢开始与拥塞避免

    发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …

    注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。

    如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

    3.4.2 快重传与快恢复

    在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1M2,此时收到 M4,应当发送对 M2 的确认。

    在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。

    在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

    慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

    在这里插入图片描述

    四、套接字Socket

    在通信之前,双方都要建立一个Socket。Socket编程进行的是端到端的通信,也只能是端到端协议之上网络层和传输层的。

    在网络层中,Socket函数需要指定到底是IPv4还是IPv6,分别对应设置为AF_INET和AF_INET6。还要指定到底是TCP还是UDPTCP协议是基于数据流的,所以设置为SOCK_STREAM,而UDP是基于数据报的,因而设置为SOCK_DGRAM


    4.1 基于TCP协议的Socket程序函数调用过程

    两端创建Socket之后,TCP的服务端调用bind函数监听一个端口, 给这个Socket赋予一个IP地址和端口

    当服务端有了IP和端口号,就可以调用listen函数进行监听。此时的客户端就可以发起连接请求了;

    在内核中为每个Socket维护两个队列,分别是已经建立了连接、完成三次握手后处于established状态的队列;一个是还没有完全建立连接的队列,三次握手还没完成,处于syn_rcvd的状态。

    接下来,服务端调用accept函数,拿出一个已经完成的连接进行处理。

    在服务端等待的时候,客户端可以通过connect函数发起连接。先在参数中指明要连接的IP地址和端口号,然后开始发起三次握手。内核会给客户端分配一个临时的端口。一旦握手成功,服务端的accept就会返回另一个Socket。

    连接建立之后双方开始通过read和write函数来读写数据,下图是基于TCP协议的Socket程序函数调用过程:
    在这里插入图片描述

    4.2 基于UDP协议的Socket程序函数调用过程

    UDP是没有连接的,所以不需要三次握手,也就不需要调用listen和connect,但是,UDP的的交互仍然需要IP和端口号,因而也需要bind函数;但正是没有连接状态,每次通信的时候,都调用sendto和recvfrom,都可以传入IP地址和端口;

    下图就是基于UDP协议的Socket程序函数调用过程
    在这里插入图片描述


    4.3 服务器如何支持高并发?

    在学习了上面的Socket函数之后,可以写一个简单的网络交互程序;

    系统会用一个四元组来标识一个TCP连接

    {本机IP, 本机端口, 对端IP, 对端端口}
    

    最大TCP连接数=客户端IP数×客户端端口数,对IPv4,客户端的IP数最多为2的32次方,客户端的端口数最多为2的16次方,也就是服务端单机最大TCP连接数,约为2的48次方。

    当然最大的TCP连接数还要受到 Socket中的文件描述符以及内存的限制

    如何在资源有限的情况下,进行更多的连接?


    方案一:多进程式

    你相当于一个代理,一旦监听到请求,建立连接就会有一个已连接的Socket,这个时候可以采用fork函数创建一个子进程,将基于已连接Socket的交互交给这个新的子进程来做。子进程就可以通过这个已连接Socket和客户端进行互通了,当通信完毕之后,就可以退出进程。父进程可以通过进程ID查看子进程是否完成项目,是否需要退出。

    相当于来了一个项目,你就找一个外包公司帮你解决这个问题。

    方案二:多线程式
    上面这种方式的问题在于,每次有项目都找外包,这个是不划算的;

    线程就相当于一个公司成立项目组,一个项目做完了,那这个项目组就可以解散,组成另外的项目组;

    通过pthread_create创建一个线程,也是调用do_fork,新的线程也可以通过已连接Socket处理请求,从而达到并发处理的目的。
    多线程式
    基于进程或者线程模型都存在一个问题:
    新到来一个TCP连接,就需要分配一个进程或者线程。一台机器无法创建很多进程或者线程,就是C10K的问题;

    C10K:
    一台机器要维护1万个连接,就要创建1万个进程或者线程,那么操作系统是无法承受的。如果维持1亿用户在线需要10万台服务器,成本也太高了。


    方案三:IO多路复用,一个线程维护多个Socket

    简述一下就是,一个项目组可以看多个项目,每个项目组都应该有个项目进度墙,将自己组看的项目列在那里,然后每天通过项目墙看每个项目的进度,一旦某个项目有了进展,就派人去盯一下。

    Socket是文件描述符,因而某个线程盯的所有的Socket,都放在一个文件描述符集合fd_set(项目进度墙)中,调用select函数来监听文件描述符集合是否有变化,一旦有变化,就会依次查看每个文件描述符。那些发生变化的文件描述符在fd_set对应的位都设为1,表示Socket可读或者可写,从而可以进行读写操作,然后再调用select,接着盯着下一轮的变化。

    方案四:IO多路复用
    方案三中采用select函数来查看fd_set是否有Socket发生变化,每次轮询都会影响性能,且能查看的数量由FD_SETSIZE限制;

    改成事件通知的方式,情况就会好很多,项目组不需要通过轮询挨个盯着这些项目,而是当项目进度发生变化的时候,主动通知项目组,然后项目组再根据项目进展情况做相应的操作。

    通过epoll多路复用模型,它不是通过轮询的方式,而是通过注册callback函数
    方式,当某个文件描述符发送变化的时候,就会主动通知。
    在这里插入图片描述
    如上图所示,进程打开了Socket m, n, x等多个文件描述符,现在需要通过epoll来监听这些Socket是否都有事件发生。其中epoll_create创建一个epoll对象,对应着打开文件列表中那个的一项,通过红黑树来保存这个epoll要监听的所有Socket。

    epoll_ctl添加一个Socket的时候,其实是加入这个红黑树;当一个Socket来了一个事件的时候,可以从这个列表中得到epoll对象,并调用call back通知它。

    这种通知方式使得监听的Socket数据增加的时候,效率不会大幅度降低,能够同时监听的Socket的数目也非常的多;


    总结

    • 需要记住TCP和UDP的Socket的编程中,客户端和服务端都需要调用哪些函数;
    • 能够支撑大量连接的高并发的服务端不容易,需要多进程、多线程,而epoll机制能解决C10K问题。
    展开全文
  • 网络协议 -- HTTP协议

    万次阅读 多人点赞 2018-03-09 13:46:25
    一、HTTP协议介绍 1.1 什么是HTTP HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP协议位于TCP/IP协议栈的传输层。 HTTP是一个客户端和服务器端请求和应答的标准,主要用于从万维网(即WWW...
  • 常见网络协议

    万次阅读 多人点赞 2019-03-26 13:32:50
    一、网络协议 二、TCP(Transmission Control Protocol,传输控制协议)       TCP头格式      TCP协议中的三次握手和四次挥手      TCP报文抓取工具三、...
  • 计算机网络协议(四)——HTTP、HTTPS、P2P协议

    万次阅读 多人点赞 2019-09-04 16:08:17
    这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师的趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,...
  • 网络协议介绍

    万次阅读 2018-08-30 13:03:24
    网络协议类型 网际层:IP ARP RARP ICMP IGMP 运输层:TCP UDB 应用层:HTTP DNS SMTP POP FTP SMB TeInet SSH 请求方法 GET POST HEAD PUT DELETE TRACE CONNECT OPTION 状态码 100继续 201创建 203非...
  • 计算机网络协议总结

    万次阅读 多人点赞 2019-05-12 16:35:29
    计算机网络协议全面总结 一、OSI七层协议 物理层: 很久很久以前,那时候还没有现在的外星人超级电脑,或者华为的P30。比较调皮的小明想要把自己机器上写好的一些个人游戏心得(如何玩好王者农药)发给小红(校花)...
  • Linux系统中网络协议和网络配置文件的介绍

    千次阅读 多人点赞 2020-07-08 11:29:10
    网络协议和网络配置文件的介绍一.网络协议介绍1.1 网络协议的概念1.2 TCP/IP协议1.3 常见的网络应用协议1.3.1 HTTP协议1.3.2 DNS协议1.3.3 FTP协议1.3.4 Telnet协议二.网络配置文件介绍2.1 配置文件介绍2.2 网络接口...
  • 网络协议 -- UDP协议(4)组播

    万次阅读 2017-12-29 17:12:43
    网络协议–UDP协议(1)介绍可以知道,适用于分组的IP有224.0.0.0 ~ 239.255.255.255。 同样,发送端就需要将数据发送到该分组IP。 一、发送端 #include #pragma comment(lib, "Ws2_32.lib") void SendLog
  • 网络协议 -- IP地址

    万次阅读 2017-12-28 22:03:54
    关于IP的分类等基础知识,可以参考:网络协议 – 基础概念 一、相关结构体 struct in_addr // sizeof(in_addr) == sizeof(ULONG) == 4 // typedef struct in_addr { union { struct { UCH
  • 文章目录网络协议TCP/IP协议IP协议...网络协议 网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。 常见的协议有:TCP/IP协议、IPX/SPX协议、NetBEUI协议 等。 TCP/IP协议 毫无疑问是这三大协议...
  • 网络体系结构和网络协议

    千次阅读 2018-05-02 22:32:26
    网络体系结构和网络协议是计算机网络技术中两个最基本的概念。今天我们将从网络层次,服务和协议的基本概念出发,理解一下网络中基本的概念。 一. 网络体系结构的基本概念 1. 什么是网络协议 在生活中,我们多于...
  • 在定义协议首部数据结构时,需要考虑字节对齐、大小端的问题,可以参考: 彻底理解内存对齐 大端(Bid Endian)、小端(Little Endian)含义 大小端的判断使用了rtc_base/basictypes.h头文件中提供的宏RTC_ARCH_...
  • 计算机网络协议层次

    千次阅读 2018-08-18 10:44:55
    计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。计算机网络协议同我们的语言一样,多种多样。 为了给网络协议的设计提供一个结构,网络...
  • 1.1 为什么需要了解网络协议? 1.2 OSI七层模型与TCP/IP四层概念模型 2.网络协议 2.1 什么是网络协议 2.1.1 网络协议的组成 2.2 网络协议的类型 2.3 TCP协议 2.4UDP协议 2.5HTTP协议 2.5.1 http与...
  • 计算机网络协议集合

    千次阅读 2018-03-21 09:17:26
    阅读目录 1. 网络层次划分2. OSI七层网络模型3. IP地址4. 子网掩码及网络划分5. ARP/RARP协议6. 路由选择协议7. TCP/IP协议8. UDP协议 9.... 计算机网络学习的核心内容就是网络协议的学习。网络...
  • 使用wireshark抓包并进行网络协议分析

    万次阅读 多人点赞 2018-10-18 15:37:35
    今天想通过抓包实验,巩固一下所学习的网络协议。同时,在知识点上会加上以前遇到的一些问题。这次实验并不是对所有的网络协议都进行分析,而是从下面这个问题出发(面试常被问)。从这一过程中复习学过的网络协议。...
  • 网络协议面试题汇总

    千次阅读 2019-03-12 10:48:43
    Internet采用哪种网络协议?该协议的主要层次结构? TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础。 TCP/IP是用于...
  • 网络协议 -- HTTPS(3)SSL/TSL协议

    万次阅读 2018-03-12 12:23:28
    前面的《网络协议 – HTTP协议》我们介绍了HTTP协议,然后又写了几篇关于HTTPS的预备知识的文章,现在开始正式介绍HTTPS。 在HTTP请求过程中,客户端与服务端之前没有进行身份确认,而且传输的数据都没有加密处理,...
  • 网络协议 -- TCP协议(3)TIME_WAIT及MSL

    万次阅读 2018-01-30 15:56:40
    关于TCP的4次挥手过程参考:网络协议 – TCP协议(2)三次握手与四次挥手 一、TIME_WAIT状态为何存在? 这里我们不使用“客户端”、“服务端”来表示TCP连接的2端,转而使用“主动断开连接端”、“被动断开连接...
  • 网络协议逆向分析

    千次阅读 2017-03-19 21:07:42
    网络协议逆向分析
  • 前面的文章《网络协议 – TCP协议(2)三次握手与四次挥手》介绍了TCP的三次握手,那么TCP的握手为什么是3次了? 下面是截取自《网络协议 – TCP协议(2)三次握手与四次挥手》的三次握手过程图: 本文从3个...
  • 比特币的P2P网络协议

    千次阅读 2019-04-18 09:32:37
    比特币的P2P网络协议 转载请注明出处:https://www.jzgwind.com/?p=1001by joey 一、五层网络模型 网络的五层模型可以分为:物理层、数据链路层、网络层、传输层、应用层。 物理层: 网络的实际物理介质,...
  • 计算机网络-什么是网络协议

    千次阅读 2019-02-11 19:30:59
    协议是计算机网络有序运行的重要保证 ...网络协议(network protocol),简称为协议 ,是为进行网络中的数据交换而建立的规则、标准或约定 。 协议规定了通信实体之间所交换的消息的格式、意义、顺序以及针对...
  • 网络协议 -- 最全的网络协议

    万次阅读 多人点赞 2018-01-29 15:20:42
    转载自:http://www.52im.net 图片较大,建议单击放大或者下载后查看
  • 传感器网络协议

    千次阅读 2016-11-23 23:35:24
    传感器网络协议网络协议结构是网络的协议分层以及网络协议的集合,是对网络及其部件所应完成功能的定义和描述。虽然无线传感器网络与传统网络相比有很多不同的地方,但是其网络协议栈都可以划分成TCP/IP的五层...
  • 前言:最近工作中遇到大量的网络协议开发,现就其中一些网络协议的基础知识进行整理,文中借鉴了一些大神的整理,后面会贴上链接,如侵删)
  • 网络协议学习笔记

    千次阅读 2016-10-26 22:40:59
    网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。 网络协议主要由三个要素组成:语义、语法及时序;语义表示要做什么,语法表示要怎么做,时序表示做的顺序。 网络协议是网络上所有设备(网络...

空空如也

1 2 3 4 5 ... 20
收藏数 194,667
精华内容 77,866
关键字:

网络协议