首页 文章 精选 留言 我的

精选列表

搜索[计算机网络],共631篇文章
优秀的个人博客,低调大师

计算机网络协议介绍

一、从一个请求来看网络分层原理 1.1 复杂的网络 以下为一次请求过程中可能遇到的问题,预示着网络的复杂性。    1.2 如何简化复杂度 为了简化网络的复杂度,网络通信的不同方面被分解为多层次结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样就可以修改,甚至替换某一层的软件,只要层与层之间的接口保持不变,就不会影响到其他层。 1.2.1 OSI( Open System Interconnection Reference Model): 开放系统互联参考模型       1.2.2 TCP/IP 协议族    1.2.3 两种协议的对应关系 应用层:应用程序负责的部分 传输层:TCP、UDP、SCTP 等 网络层:IPv4、IPv6等 数据链路层:以太网、无限LAN(WIFI) 物理层:光纤、双绞线电缆、无线设备    1.3 一个请求的分层解析流程 请求各层之间都是调用对应层的接口(这个接口可以类比java中的接口,它可以有各种实现方式)。 1. 在请求过程中域名是无法直接被计算机识别的,必须先转换成ip,此时先检测本地是否配置了host,如果没有配置的话会发起一个dns请求。 2. DNS使用UDP作为传输层,DNS服务器IP配置在你的操作系统中,可以直接获取。 3. 数据链路层在接收到网络层调用后,会通过IP使用ARP协议获取当前IP对应的MAC地址。 4. 最终通过物理层将数据传入路由器,路由器进行逆向解析(MAC地址->IP),如果路由器判断此信息不是给自己的会将信息继续传给下游电信运营商。 5. 运营商判断是DNS请求还是HTTP请求,如果是DNS请求会调用DNS服务器换取IP并返回。 6. 获取IP后DNS请求完成,此时再次发送一次HTTP请求,HTTP在传输层使用的是TCP协议,其他层同理。 7. 运营商判断如果非DNS请求,那么电信会通过运营商直接的协议进行消息的发送,最终找到ip对应的服务器。 8. 接收端服务器的物理层接受到此次请求,通过对应的协议进行数据的层层解析获取对应的信息,最终将数据传给本地服务器(nginx、tomcat等),服务器将响应报文通过HTTP方式将数据返回。 一次请求的流转如下图:    二、HTTP协议 超文本传输协议(HyperText Transfer Protocol,HTTP): 一种无状态的,以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与 基于网络的超文本信息系统灵活的互动 2.1 HTTP报文格式 请求报文和响应报文的结构基本相同。 起始行:描述请求或响应的基本信息。 头部字段集合:key-value结构,报文的详细信息。 消息体:真实传输的内容,可以是文本或二进制等。 2.1.1 HTTP请求报文 一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。    2.1.1.1 请求行 请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。 HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。 2.1.1.2 请求头部 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有: User-Agent:产生请求的浏览器类型。 Accept:客户端可识别的内容类型列表。 Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。 2.1.1.3 空行 最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。 2.1.1.4 请求数据 请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type(这个主体的对象类型)和Content-Length(主体的长度)。 2.1.1.5 头部字段注意事项 字段名不区分大小写,字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”(有的服务器不会解析带“_”的头字段)。字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格; 字段的顺序是没有意义的,可以任意排列不影响语义; 字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。 2.1.2 HTTP响应报文 HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。    2.1.2.1 状态行格式如下 HTTP-Version Status-Code Reason-Phrase CRLF 其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。 • 1xx:指示信息–表示请求已接收,继续处理。 • 2xx:成功–表示请求已被成功接收、理解、接受。 • 3xx:重定向–要完成请求必须进行更进一步的操作。 • 4xx:客户端错误–请求有语法错误或请求无法实现。 • 5xx:服务器端错误–服务器未能实现合法的请求。 常见状态代码、状态描述的说明如下: • 200 OK:客户端请求成功。 • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。 • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。 • 403 Forbidden:服务器收到请求,但是拒绝提供服务。 • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。 • 500 Internal Server Error:服务器发生不可预期的错误。 • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。 百度百科 状态码参考网址 2.1.2.1 响应头 Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:* Access-Control-Expose-Headers:Date,X-API-Request-Id Content-Encoding:gzip Content-Type:application/json;charset=UTF-8 Date:Sun, 10 Mar 2024 12:00:17 GMT 2.1.2.2 响应实体内容 服务器发给浏览器,要让浏览器显示的内容(html,js,css,图片,数据等信息)。 三、HTTP请求完整过程 3.1 请求过程描述 1. 首先浏览器先解析URL中的域名。 2. 通过域名获取对应的ip地址,上边已经说过ip是通过DNS服务器获取,我们可以在谷歌浏览器中查看到域名对应ip的解析。 3. 获取到IP地址后,浏览器就可以发起与服务器的三次握手 4. 建立连接后,就开始组装http请求,发送请求。 5. 接收端收到请求后,开始处理请求解析请求头中的数据,并生成对应的响应数据,给发送端返回响应数据。 6. 浏览器收到响应后,会通过响应头类型,解析对应的数据报文。 补充:上边2中从浏览器中获取域名的步骤。 浏览器中输入:chrome://net-export/ 打开对应文件搜索你想找的域名即可。    四、TCP协议 4.1 TCP协议描述 面向连接的,可靠的,基于字节流的传输层通信协议 4.2 TCP协议特点 • 基于连接的:数据传输之前需要建立连接 • 全双工的:双向传输 ◦ 客户端和服务端可以互相双向写数据 • 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃 ◦ 发送方:每次传输不限制数据大小,不是一次性将所有的数据都传输,会将数据切分成多个片段,并进行排序,通过网络介质传输给接收方。 ◦ 接收方:不同的数据包会通过网络不同的路线传入接受方,因此接收方收到的数据有可能是乱序的,因此需要对数据包进行重排序。 • 流量缓冲:解决双方处理能力的不匹配 • 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性 • 拥塞控制:防止网络出现恶性拥塞 ◦ 当网络环境比较差的时候,会控制报文大小减小传输速率。 4.3 TCP连接管理 4.3.1 TCP连接四元组 四元组分别为:源地址、 源端口、 目的地址、 目的端口 4.3.2 TCP头部格式    序列号:在建⽴连接时由计算机⽣成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送⼀次数据,就累加⼀次该数据字节数的⼤⼩。⽤来解决⽹络包乱序问题。 确认应答号:指下⼀次期望收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。⽤来解决不丢包的问题。 控制位: ACK:该位为 1 时,确认应答的字段变为有效,TCP 规定除了最初建⽴连接时的 SYN 包之外该位必须设置为 1 。 RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。 SYN:该位为 1 时,表示希望建⽴连接,并在其序列号的字段进⾏序列号初始值的设定。 FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双⽅的 主机之间就可以相互交换FIN位为 的 TCP 段。 URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应该尽快传送,而不按照原来的排队序列来传送。 PSH:推送(PuSH),当两个应用进程进行交互式的通信时,有时一端的应用进程希望在键入一个命令之后就能立即收到对方的响应。在这样的情况下,就可以使用推送操作,此时,发送方将PSH置为1,并创建一个报文发送出去,接收端接受到该报文,发现PSH为1,就尽快交付接受应用进程,而不用等到整个缓存都满了之后再向上交付。 紧急数据指针:当发送端需要发送一些紧急数据时,可以设置紧急指针来指示接收端,在接收到该指针之后尽快处理这些数据。紧急指针的值是一个相对于当前序列号的偏移量,用于指示紧急数据在整个数据流中的位置。 窗口大小:当前服务器缓存可接受的数据报文大小。 4.4 TCP 三次握手    说明: 1. 开始时服务端和客户端的连接处于断开状态。 2. 服务端启动后会监听特定端口,处于监听状态,等待客户端的请求。 3. 客户端发起请求,变更成发送状态,此时会在请求中携带同步序列号 x。 4. 服务端接受到请求后,保存客户端对应的信息,并发送确认收到应答消息,此消息的应答码需要在x的基础上加1,此时服务端处于等待客户端确认状态。 5. 客户端收到服务端确认后,状态变更为已连接,客户端也需要给服务端回复确认收到,此时应答码为服务端确认码y+1。 6. 服务端收到客户端确认消息后,状态变更为已连接。 7. 连接建立成功,此为三次握手。 8. 握手过程中会消耗序号,建立链接后不会消耗。 以下是三次握手的示例过程:    4.5 TCP 四次挥手    说明: 1. 客户端和服务端都可以主动发起关闭连接。 2. 图中为客户端发起关闭连接,首先客户端发起 FIN 关闭连接请求。 3. 服务端收到关闭请求后,先回复收到关闭请求的确认消息给客户端,此时客户端处于等待关闭2状态,等待服务端完成收尾工作,服务端完成收尾(剩余未完成传输数据同步),执行关闭连接方法,并给客户端发送FIN 关闭链接请求。 4. 客户端收到关闭请求后,给服务端回复确认关闭应答消息,服务端关闭,客户端处于等待状态,此时需要等待两个最大请求时长(防止服务端由于网络原因未收到应答消息,服务端会重试发送FIN消息)。 5. 等待时间到期后关闭连接。 4.5 TCP 可靠性传输 4.5.1 停止等待协议 描述:没传送一个报文,服务端都回复一个确认消息,效率低下。    4.5.1 重传机制 4.5.1.1 ack丢失 描述:如果出现丢包如何处理    4.5.1.2 报文丢失    4.5.2 滑动窗口协议与累计确认(延时ack)    说明: 1. 约定窗口大小为4,每次发送四个报文。 2. 服务端收到后只收到,1,2,4。 3丢失,此时服务端确认只确认到2。 3. 客户端收到确认后,从3开始在滑动下一个窗口,进行数据传输。 参考文献 OSI参考模型: https://baike.baidu.com/item/OSI%E5%8F%82%E8%80%83%E6%A8%A1%E5%9E%8B/708028?fr=aladdin HTTP状态码: https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81?fromModule=lemma_search-box TCP协议: https://baike.baidu.com/item/TCP/33012?fr=ge_ala TCP与UDP的可靠性传输: https://zhuanlan.zhihu.com/p/636141175

优秀的个人博客,低调大师

计算机网络(四)——交换机与路由器

交换机的主要作用是为了解决因为冲突而导致的资源浪费问题,交换机将每一个主机或分为一个冲突域,也就是划分物理网段,这样主机与主机之间就不会再产生冲突,这种划分方式叫做微分段; 路由器的主要作用是去实现网络层的网络异构功能,将一个局域网划分成一个个子网即逻辑网段,分别进行管理,将广播域划分,划分成一个个小的广播域,这种划分方式也就是子网划分; 首先先说交换机,交换机采用的是全双工模式进行通信,仅限于点对点连接,不会产生冲突,而在以前所使用的集线器采用的是半双工模式进行通信,他可以在同一时间进行单向的通信,产生冲突的可能性就高;而在以前交换机刚刚出现的时候,虽然解决好了因集线器方式产生的冲突问题,但仍然有一些问题的存在;交换机的连接方式大多采用树形连接,一台交换机在连接着底层的主机时还必须保证在这台交换机出现损坏后,连在这台交换机下的主机能够正常运行,这个时候就必须加上另一台交换机连接这些主机,两台交换机不论谁出现错误都不会导致主机不能运行;在大型网络架构当中,必须保证任何一个仪器的损坏不会引起整个网络的瘫痪,这个时候就必须有冗余;而交换机连接的层级有三种,接入层,专门连接底层主机;分布层,连接关于底层主机的交换机;核心层,连接关于分布层的交换机,实现超高速数据转发,以万兆为单位;交换机的工作方式是当收到某一封装好的IP数据报,当发现没有这一IP数据报的源地址,就将源地址写入到转发表中,在进行广播;这种方式在小的网络架构中也许不会出现多大的问题,但在大的网络架构中,几十台甚至几百台交换机在一起时,这种方式就会产生广播风暴,可能使一个IP数据报由源主机发送到目的主机后会产生多个结果;而在源主机不知道目的主机的MAC地址,而使用ARP协议获取时,也会产生多个由目的主机发来的MAC地址,导致MAC地址抖动,目标主机无法识别;而这些由交换机带来的新的问题都可以由生成树协议来解决; 路由器可以将一个网络划分成多个子网,而路由器又是根据什么来划分子网的呢? 子网掩码 使用子网掩码可以实现逻辑网段的划分,同IP地址一样,子网掩码是用的也是32bit二进制数字组成;原来的IP地址是两级IP地址结构,只有网络号以及主机号,而划分子网的方法就是从主机位借用若干位作为子网号,形成网络位,子网位,主机位三级IP地址结构;这样的结构会使主机的数目降低,构成这个子网; 子网掩码是由一串0与1组成,子网掩码中的1对应着IP地址的网络位,子网掩码中的0对应IP地址的主机位; 如145.13.3.10 IP地址 其为B类地址,有16为网络位,16位主机位,则其子网掩码为 11111111.11111111.00000000.00000000 而在路由器当中,当收到一个封装好的数据报时,将其目的IP地址与保存在路由器中的路由表的子网掩码相与所得出的网络地址,是否与该路由表中的子网掩码所对应的网络地址相同,若相同,则该数据报所要寻找的目的地址,就是该网络地址,若不相同则往下继续与子网掩码相与;若都不相同则抛弃该数据报,表示该路由器相连的子网没有一个是其目的子网;而每一个网络地址都代表着一个子网;所以要判断一个数据报是否属于这个子网,就要判断其网络地址是否相同; 如 IP地址172.16.9.8 10101000.00010000.00000000.00000000 子网掩码 11111111.11111111.00000000.00000000 逻辑与: 10101000.00010000.00000000.00000000 网络地址172.16.0.0 IP地址172.16.99.88 10101000.00010000.01100011.01011000 子网掩码 11111111.11111111.00000000.00000000 逻辑与: 10101000.00010000.00000000.00000000 网络地址172.16.0.0 两者网络地址相同,在同一个网段中 在大多数情况下,IP地址的子网掩码都是使用默认的子网掩码,也可手动指定 如 A类IP地址默认子网掩码11111111.00000000.00000000.00000000 B类IP地址默认子网掩码11111111.11111111.00000000.00000000 C类IP地址默认子网掩码11111111.11111111.11111111.00000000 D类IP地址默认子网掩码11111111.11111111.11111111.11111111 子网掩码的表示形式也可写成斜线记法的形式 如 172.16.99.88其子网掩码为11111111.11111111.00000000.00000000 可写成172.16.99.88/16表示有16位网络位的子网掩码 路由器 路由器的作用是实现网络层中的异构网络,实现子网的划分;路由器中的路由表主要是由三部分组成但不是说就这三部分,这两部分为目的网络地址,子网掩码以及下一跳地址;而在路由器中主要实现其功能的基础就是路由表,当路由器收到数据报时将其IP地址与路由表中第一条记录中的子网掩码相与,得出结果与第一条记录的目的网络进行对比,若相同则表示该数据报要送的目的地址就是第一条记录所对应的网络地址,则将其转发至这一条记录的下一跳地址;否则就继续将数据报与下一跳记录进行相同的操作,若在路由表中没有找到对应的网络地址;则将该数据报抛弃,表示在这个路由表中不存在该数据报目的地址所对应的网络; 路由表是路由器转发数据的关键 路由表是如何出现在路由器中: 1.路由表是一组具有一定标准格式的数据信息; 2.如果是管理员收到的添加到路由表中的信息,这类路由信息,称为静态路由; 3.如果是路由器之间通过特定协议相互通告得到的路由信息,称为动态路由; 4.一般来讲,静态路由永久有效,动态路由在特定时间范围内有效; 标准的路由条目: 路由条目来源 目标网络地址 [管理距离/度量值] via 下一跳地址 路由条目的来源: C:直接路由,在路由器物理接口上配置的IP地址对应的路由条目 S:静态路由 D,R,O,O E1,O E2,D EX,B:动态路由 S*:静态默认路由 D*,O*:动态默认路由 在网络出现故障时如何排除故障? ①使用分层方式排除交换机故障 物理层:查看是否是网线问题,网线是否断开或者虚接; 数据链路层:交换机是否正常运行;交换机物理介质与接口是否匹配; 网络层:交换机管理是否正常; 分层查看,确定问题在哪里,这样方便解决问题; ②确定和解决介质问题 线路是否损坏; 是否引进了新的磁场; 是否安装新的设备; 流量模式是否变更; ③噪声过多 查看是否是线缆损坏 使用show interface ethernet EXEC命令来确定以太网接口状态,如果出现许多CRC校验错误但并没有出现许多冲突,则证明是噪声引起的问题; ④冲突过多,延迟冲突 使用show interface ethernet来检查冲突率是否超过0.1; 查看网络线缆是否过长,两个主机线缆之间的距离是否不符合标准,这样会产生延迟冲突; ⑤双工模式产生的问题 双工模式 两端端口必须都为同样的双工模式; 一端为全双工,一端设为自动协商,若自动协商失败则端口会变为半双工模式,导致不匹配;或者两端都为自动协商模式,一端失败后转为半双工,一端失败后恢复为全双工导致不匹配; 双工模式匹配时,若一端设为一种速度,另一端设为另一种速度则会导致不匹配; 本文转自 wujunqi1996 51CTO博客,原文链接:http://blog.51cto.com/12480612/1943266

优秀的个人博客,低调大师

java面试-计算机网络传输层知识点全覆盖

点击打开网络通信的七层协议 传输层概述 作用:传输层为它上面的应用层提供通信服务。 在OSI七层参考模型中,传输层是面向通信的最高层,也是用户功能的最底层。 传输层两大重要的功能:复用 和 分用。 复用:在发送端,多个应用进程公用一个传输层; 分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程。 和网络层的区别: 网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务。 网络层只对报文头部进行差错检测,而传输层对整个报文进行差错检测。 UDP(用户数据报协议)详解 UDP的特点 UDP只在IP数据报服务的基础上增加了少量的功能:复用与分用、对整个报文的差错检测。 UDP是无连接的通信前不需要建立连接,通信结束也无需释放连接。 UDP是不可靠的它是尽力而为交付,不能确保每一个数据报都送达。 UDP是面向报文的所谓『面向报文』就是指:UDP数据传输的单位是报文,且不会对数据作任何 拆分 和 拼接 操作。在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层。在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作。 UDP没有拥塞控制UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊。弊端:网络拥塞时有些报文可能会丢失,因此UDP不可靠。优点:有些使用场景允许报文丢失,如:直播、语音通话,但对实时性要求很高,此时UDP还是很有用武之地的。 UDP支持一对一、一对多、多对多、多对一通信而TCP只支持一对一通信。 UDP首部开销小,只有8字节。而TCP头部至少由20字节,相比于TCP要高效很多。 PS:问:UDP不可靠具体体现在哪些方面?数据报丢失?数据报顺序? UDP报文头 源端口 目的端口 长度:整个数据报的长度 检验和:整个数据报的检验和。 TCP(传输控制协议)详解 TCP特点 TCP是面向连接的通信前需要建立连接,通信结束需要释放连接。 TCP提供可靠交付服务所谓『可靠』指的是:TCP发送的数据无重复、无丢失、无错误、与发送端顺序一致。 TCP是面向字节流的所谓『面向字节流』指的是:TCP以字节为单位。虽然传输的过程中数据被划分成一个个数据报,但这只是为了方便传输,接收端最终接受到的数据将与发送端的数据一模一样。 TCP提供全双工通信所谓『全双工通信』指的是:TCP的两端既可以作为发送端,也可以作为接收端。 一条TCP连接的两端只能有两个端点TCP只能提供点到点的通信,而UDP可以任意方式的通信。 TCP连接 与 套接字 什么是『TCP连接』?TCP连接是一种抽象的概念,表示一条可以通信的链路。每条TCP连接有且仅有两个端点,表示通信的双方。且双发在任意时刻都可以作为发送者和接收者。 什么是『套接字』?一条TCP连接的两端就是两个套接字。套接字=IP地址:端口号。因此,TCP连接=(套接字1,套接字2)=(IP1:端口号1,IP2:端口号2) TCP头部 TCP头部长度有20字节的固定部分,选项部分长度不定,但最多40字节,因此TCP头部在20-60字节之间。 源端口 和 目的端口传输层和网络层一大重要区别就是传输层指定了数据报发往的应用进程,因此需要端口号标识。 序号当前TCP数据报数据部分的第一个字节的序号。我们知道,TCP是面向字节的,它会对发送的每一个字节进行编号,而且不同数据报之间是连续编号的。由于本字段4字节,可以给[0,2^32-1]个字节进行编号(大约4G),而且序号循环使用,当发送完2^32-1个字节后,序号又从0开始。一般来说,当2^32-1个字节被发送的时候,前面的字节早就发送成功了,因此序号可以循环使用。 确认号表示当前主机作为接收端时,期望接收的下一个字节的编号是多少。也表示,当前主机已经正确接收的最后一个字节序号+1。 数据偏移(报文长度)它表明了数据报头部的长度。 保留字段 标识符TCP有7种标识符,用于表示TCP报文的性质。它们只能为0或1。 URG=1当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。如control+c:这个命令要求操作系统立即停止当前进程。此时,这条命令就会存放在数据包数据部分的开头,并由紧急指针标识命令的位置,并URG字段被置1。 ACK=1ACK被置1后确认号字段才有效。此外,TCP规定,在连接建立后传送的所有报文段都必须把ACK置1。 PSH=1当接收方收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后再提交。一些交互式应用需要这样的功能,降低命令的响应时间。 RST=1当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。 SYN=1SYN在建立连接时使用。当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。 FIN=1FIN=1表示此报文段是一个释放连接的请求报文。 接收窗口大小该字段用于实现TCP的流量控制。它表示当前接收方的接收窗口的剩余容量,发送方收到该值后会将发送窗口调整成该值的大小。发送窗口的大小又决定了发送速率,所以接收方通过设置该值就可以控制发送放的发送速率。发送方每收到一个数据报都要调整当前的发送窗口。 检验和用于接收端检验整个数据包在传输过程中是否出错。 紧急指针用于标识紧急数据的尾部。 选项字段上述字段都是每个TCP头部必须要有的,而选项字段是可选的,且长度可变,最长40字节。最常用的选项字段为MMS:最大报文长度。 TCP三次握手 PS:TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。 起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。 第一次握手客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。 PS1:SYN=1,ACK=0表示该报文段为连接请求报文。 PS2:x为本次TCP通信的字节流的初始序号。TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。 第二次握手服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。该应答发送完成后便进入SYN-RCVD状态。 PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。 PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。 PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。 第三次握手当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。该报文段的头部为:ACK=1,seq=x+1,ack=y+1。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成! 为什么连接建立需要三次握手,而不是两次握手?防止失效的连接请求报文段被服务端接收,从而产生错误。 PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。 若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。 TCP四次挥手 TCP连接的释放一共需要四步,因此称为『四次挥手』。我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。 第一次挥手若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。 PS1:FIN=1表示该报文段是一个连接释放请求。 PS2:seq=u,u-1是A向B发送的最后一个字节的序号。 第二次挥手B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1,seq=v,ack=u+1。 PS1:ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。 PS2:seq=v,v-1是B向A发送的最后一个字节的序号。 PS3:ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。 A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。 第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。 第三次挥手当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。 第四次挥手A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。 为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?为了保证B能收到A的确认应答。若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。 TCP可靠传输的实现 TCP的可靠性表现在:它向应用层提供的数据是 无差错的、有序的、无丢失的,简单的说就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的。TCP采用了流量控制、拥塞控制、连续ARQ等技术来保证它的可靠性。 PS:网络层传输的数据单元为『数据报』,传输层的数据单元为『报文段』,但为了方便起见,可以统称为『分组』。 停止等待协议(ARQ协议) TCP保证其可靠性采用的是更为复杂的滑动窗口协议,但停止等待协议是它的简化版,为了方便理解,这里先介绍停止等待协议。 AQR协议 ARQ(Automatic Repeat reQuest)自动重传请求。顾名思义,当请求失败时它会自动重传,直到请求被正确接收为止。这种机制保证了每个分组都能被正确接收。停止等待协议是一种ARQ协议。 停止等待协议的原理 无差错的情况A向B每发送一个分组,都要停止发送,等待B的确认应答;A只有收到了B的确认应答后才能发送下一个分组。 分组丢失和出现差错的情况发送者拥有超时计时器。每发送一个分组便会启动超时计时器,等待B的应答。若超时仍未收到应答,则A会重发刚才的分组。分组出现差错:若B收到分组,但通过检查和字段发现分组在运输途中出现差错,它会直接丢弃该分组,并且不会有任何其他动作。A超时后便会重新发送该分组,直到B正确接收为止。分组丢失:若分组在途中丢失,B并没有收到分组,因此也不会有任何响应。当A超时后也会重传分组,直到正确接收该分组的应答为止。综上所述:当分组丢失 或 出现差错 的情况下,A都会超时重传分组。 应答丢失 和 应答迟到 的情况TCP会给每个字节都打上序号,用于判断该分组是否已经接收。应答丢失:若B正确收到分组,并已经返回应答,但应答在返回途中丢失了。此时A也收不到应答,从而超时重传。紧接着B又收到了该分组。接收者根据序号来判断当前收到的分组是否已经接收,若已接收则直接丢弃,并补上一个确认应答。应答迟到:若由于网络拥塞,A迟迟收不到B发送的应答,因此会超时重传。B收到该分组后,发现已经接收,便丢弃该分组,并向A补上确认应答。A收到应答后便继续发送下一个分组。但经过了很长时间后,那个失效的应答最终抵达了A,此时A可根据序号判断该分组已经接收,此时只需简单丢弃即可。 停止等待协议的注意点 每发送完一个分组,该分组必须被保留,直到收到确认应答为止。 必须给每个分组进行编号。以便按序接收,并判断该分组是否已被接收。 必须设置超时计时器。每发送一个分组就要启动计时器,超时就要重发分组。 计时器的超时时间要大于应答的平均返回时间,否则会出现很多不必要的重传,降低传输效率。但超时时间也不能太长。 滑动窗口协议(连续ARQ协议) 连续ARQ协议在ARQ协议发送者每次只能发送一个分组,在应答到来前必须等待。而连续ARQ协议的发送者拥有一个发送窗口,发送者可以在没有得到应答的情况下连续发送窗口中的分组。这样降低了等待时间,提高了传输效率。 累计确认在连续ARQ协议中,接收者也有个接收窗口,接收者并不需要每收到一个分组就返回一个应答,可以连续收到分组之后统一返回一个应答。这样能节省流量。TCP头部的ack字段就是用来累计确认,它表示已经确认的字节序号+1,也表示期望发送者发送的下一个分组的起始字节号。 发送窗口发送窗口的大小由接收窗口的剩余大小决定。接收者会把当前接收窗口的剩余大小写入应答TCP报文段的头部,发送者收到应答后根据该值和当前网络拥塞情况设置发送窗口的大小。发送窗口的大小是不断变化的。发送窗口由三个指针构成: p1p1指向发送窗口的后沿,它后面的字节表示已经发送且已收到应答。 p2p2指向尚未发送的第一个字节。p1-p2间的字节表示已经发送,但还没收到确认应答。这部分的字节仍需保留,因为可能还要超时重发。p2-p3间的字节表示可以发送,但还没有发送的字节。 p3p3指向发送窗口的前沿,它前面的字节尚未发送,且不允许发送。 发送者每收到一个应答,后沿就可以向前移动指定的字节。此时若窗口大小仍然没变,前沿也可以向前移动指定字节。当p2和前沿重合时,发送者必须等待确认应答。 接收窗口接收者收到的字节会存入接收窗口,接收者会对已经正确接收的有序字节进行累计确认,发送完确认应答后,接收窗口就可以向前移动指定字节。如果某些字节并未按序收到,接收者只会确认最后一个有序的字节,从而乱序的字节就会被重新发送。 连续ARQ的注意点 同一时刻发送窗口的大小并不一定和接收窗口一样大。虽然发送窗口的大小是根据接收窗口的大小来设定的,但应答在网络中传输是有时间的,有可能t1时间接收窗口大小为m,但当确认应答抵达发送者时,接收窗口的大小已经发生了变化。此外发送窗口的大小还随网络拥塞情况影响。当网络出现拥塞时,发送窗口将被调小。 TCP标准并未规定未按序到达的字节的处理方式。但TCP一般都会缓存这些字节,等缺少的字节到达后再交给应用层处理。这比直接丢弃乱序的字节要节约带宽。 TCP标准规定接收方必须要有累计确认功能。接收方可以对多个TCP报文段同时确认,但不能拖太长时间,一般是0.5S以内。此外,TCP允许接收者在有数据要发送的时候捎带上确认应答。但这种情况一般较少,因为一般很少有两个方向都要发送数据的情况。 流量控制 什么是流量控制?如果发送者发送过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。 流量控制的目的?流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。 如何实现流量控制?由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。 流量控制引发的死锁当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。 持续计时器为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。 拥塞控制 拥塞控制 和 流量控制 的区别?1. 拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;2. 流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收。PS:拥塞控制是针对于网络而言的,它是防止往网络中写入太多分组,从而导致网络拥塞的情况;而流量控制是针对接收者的,它是通过控制发送者的发送速度保证接收者能够来得及接收。 拥塞控制的目的?1. 缓解网络压力2. 保证分组按时到达 慢开始算法 和 拥塞避免算法 发送方维护一个发送窗口,发送窗口的大小取决于网络的拥塞情况和接收窗口的大小,发送窗口是动态变化的。 发送方还维护一个慢开始门限 发送窗口 < 慢开始门限:使用慢开始算法 发送窗口 > 慢开始门限:使用拥塞避免算法 发送窗口 = 慢开始门限:使用慢开始算法或拥塞避免算法 算法的具体过程: 通信开始时,发送方的发送窗口设为1,并发送第一个分组M1; 接收方收到M1后,返回确认应答,此时发送方发送窗口扩大两倍,并发送M2、M3;(即,发送方每次收到确认应答后,都将发送窗口设为当前值的两倍) 若发送窗口>慢开始门限,则使用拥塞避免算法,每次收到确认应答后都将发送窗口+1; 若发送方出现了超时重传,则表明网络出现拥塞,此时:a)慢开始门限设为当前发送窗口的一半;b)发送窗口设为1;c)启用拥塞避免算法;PS:发送超时重传时,发送窗口有可能已经超过了慢开始门限,也有可能还没超过;此时不管何种情况,都一律启用拥塞避免算法,并执行上述三步操作! 慢开始算法的作用:慢开始算法将发送窗口从小扩大,而且按指数级扩大,从而避免一开始就往网络中注入过多的分组从而导致拥塞;它将窗口慢慢扩大的过程其实也在探测网络拥塞情况的过程,当发现出现拥塞时,及时降低发送速度,从而减缓网络拥塞。 拥塞避免算法的作用:拥塞避免算法使发送窗口以线性方式增长,而非指数级增长,从而使网络更加不容易发生拥塞。 AIMD算法(加法增大乘法减小算法)慢开始算法 和 拥塞避免算法 还有个名称叫做『加法增大乘法减小算法』。 加法增加:指的是拥塞避免算法,使得发送窗口以线性的方式增长; 乘法减小:指的是不管当前正使用慢开始算法还是拥塞避免算法,只要发生拥塞时,慢开始门限将会变成当前窗口的一半。 快重传算法 和 快恢复算法 上述慢开始算法和拥塞避免算法能保证网络出现拥塞时进行相应的处理,而快重传和快恢复是一种拥塞预防的方式,此时网络可能尚未出现拥塞,但已经有拥塞的征兆,因此得作出一些预防措施。 快重传原理:因为TCP具有累计确认的能力,因此接收者收到一个分组的时候不会立即发出应答,可能需要等待收到多个分组之后再同一发出累计确认。但快重传算法就要求,接收者如果接收到一个乱序的分组的话,就必须立即发出前一个正确分组的确认应答,这样能让发送者尽早地知道有一个分组可能丢失。 快恢复原理:当发送者收到同一个分组的三个确认应答后,就基本可以判断这个分组已经丢失了;这时候无需等待超时,直接执行『乘法减小加法增大』: 将慢开始门限减半; 将发送窗口减半(不设为1); 使用拥塞避免算法;

优秀的个人博客,低调大师

计算机网络课程设计(第2版)》——2.4节课程设计分析

2.4 课程设计分析校验和的计算过程主要分为三个步骤:数据文件的输入、校验和的计算和校验结果的输出。其中,主要的是数据的输入和校验和的计算。 数据的输入方式输入数据可能是以字符形式存储的,而校验和的计算则要采用数据形式,所以在从文件读取数据时,都要进行字符到数据的相互转换。 1) 将读入的ASCII码转化为相应的整型变量。 if(ch>='0'&&ch<='9') ch-='0'; else { if(ch>='a'&&ch<='f') ch=ch-'a'+10; else if(ch>='A'&&ch<='F') ch=ch-'A'+10; } 2) 在使用C++编程时直接使

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册