计算机网络知识总结

OSI七层协议结构和TCP/IP体系结构

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

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

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

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

 

物理层(传输的单位是比特)(中继器,集线器)

物理层关注的是连接各种计算机传输媒体上的原始的比特交互方式及其接口,而不关心具体的物理设备或传输媒体。

物理层的作用正是要尽可能的屏蔽种类繁多的物理设备和传输媒体的差异。使得这些差异对上面的数据链路层透明。

总得来说物理层就是用来控制数据在传输媒体上的传输方式,在传输媒体上如何传输。

操作的单位是比特,经过这一层的操作使得上一层数据链路层只需要操作网络层提供的比特就可以完成自己的协议和服务

中继器、集线器、还有我们通常说的双绞线也工作在物理层

 

数据链路层(传输的单位是帧)(设备:网桥,交换机):

链路层的任务是将上层交付的数据报通过单端链路从一个节点传输到相邻的节点。链路层协议交互的数据单元成帧。每个帧封装了网络层的一个数据包,这种封装过程成为成帧。

    链路层定义了在链路两端的结点之间交互的帧格式。物理层是规定了在物理媒体上如何传输数据单元,而数据链路层规定了点到点的链路如何完成传输数据,这个链路并不是指物理层意义上的各种物理链路,而是指抽象的连接这两个点的链路。

这一层还有几个重要的功能:

成帧:链路层的帧要在链路上传输之前想要将网络层的数据包用链路层封装起来。

差错控制:由于帧在传输过程中由于信道的不完善,如信号衰减和电磁噪音,许多链路层协议提供一种机制来检测是否存在这样的差错。发送端系统在帧中设置差错检错比特,接收端系统用同样的方法进行差错检测,如果检测出比特不同,就通知对方重新发送帧。

可靠交付:当链路层提供可靠交付服务时,它保证无差错地经过链路传输每个帧。

媒体访问(MAC):规定了结点在链路上传输帧的规则。当仅有一个节点MAC很简单,但是有多个结点共享一条通信通道时,就需要MAC协调多个结点的帧传输。

流量控制:链路每一端的结点具有有限容量的帧缓存能力,如果发送速度大于接受速度不同,可能会造成结点缓存区移溢出,使帧丢失,链路层协议需要提供某种流量控制,防止出现上面的情况发生。

MAC地址

如果时两个点之间的单独通信,那我们直接发送数据就好,可是多个节点要进行通讯,那么每个结点都必须要具有唯一标识符。这个标识符就是链路层地址也就是局域网地址或者物理地址或者MAC地址(这三个地址只是不同的叫法)。MAC地址不会改变,就像人的身份证号一样。一个结点必须同时具有一个网络层(ip)地址和一个MAC地址。

当某适配器要向目的适配器发送一个帧时,发送适配器将目的适配器的MAC地址插入到该帧中发送到局域网中如果该局域网是一个广播式局域网,那么该帧将会被局域网上所有其他适配器接收和处理。每个适配器都对接收到的帧进行检查。看该帧的目的地址和自己的目的地址是否相配,如果不匹配则丢弃该帧,如果匹配,则该适配器取出封装的数据包。沿协议栈传到结点的网络层。如果目的地址是MAC广播地址,所有适配器都将视为传递给自己的帧。

链路层交换机:

可以识别数据包中的MAC地址信息,根据MAC地址进行转发,并将这些MAC地址与对应的端口记录在自己内部的一个地址表中。实现了过滤和转发的功能(通过交换机自身的交换表)

网络层(传输的单位是数据报)(设备:路由器)(数据格式:数据报)

将分组从网络的主机传输到网络另一侧的主机的端到端通信服务,因为有异构网络,通过网络层才能使异构网络实现互联互通。只要解决不同通信子网之间的问题(通过IP协议来完成),每个IP网络中的每个设备都具有唯一的IP地址,IP地址标识了主机在网络中的位置。一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题。 

连接各个异构网络的设备是路由器。路由器的最高层次是网络层,路由器完成了全局性路由选择和转发分组功能。

转发:当一个分组到达某路由器的一条输出链路时,该路由器必须将该分组移动到适当的输出链路中。分组的转发通过转发表。每台路由器都不知道分组到达目的地的完整路径。

路由选择:在分组从发送方经过沿途各路由器转发流向接收方之前,网络层必须先决定这些分组采用的路由和路径,并将结果存入路由器的转发表中,计算这些路径的方法被称作路由选择算法。

分组交付和直接交付的区别:

直接交付:分组从一台源主机直接传输到另一台目的主机的过程称作直接交付,不需要路由器,因为在同意网络

分组交付:当目的主机不与源主机在一个直接相连的网络上,需要先将分组转发各路由器,路由器通过后继处理。

交付需要ip地址和mac地址。

回答一个疑问:为什么直接交付也需要ip地址

1.同一网段内的PC是不需要经过IP层(三层)来交换的,二层可以直接通信。
2、实验也能成立,可以不使用TCP/IP协议,通过其他协议在不配置IP的情况下,一个二层网络(注意不是网段)里PC直接通信。
3、但因为以太网均是使用TCP/IP协议为标准的,所以终端的传递交换过程中,是以IP地址为区分标识的。所以,要想用以太网,就必须配置IP。即使在同一个广播域下,虽然没有涉及到三层交换,但还是要根据IP地址以及掩码的匹配,来识别两个PC是否在同一网段

这层的协议主要有:1.网际协议:编址规则,数据包格式,分组处理规则。

2.路由选择协议:路径选择

3。ARP&PRARP:地址映射

4.ICMP:差错报告、路由器信令。

这一层最重要的协议时网际协议(ip协议):主要任务是因特网编址和转发。

IPv4数据报格式如下:

版本号(4比特):就是ipv4.

首部长度(4比特):该字段用来确定IP数据报中数据实际开始的长度。

服务类型(1字节):区分不同类型的ip数据报(如一些特别要求低延时、高吞吐量或可靠性数据报用该字段来标识)

数据报长度(2字节):数据报总长度

标识(16比特):当ip发送数据报时,它就把计数器的当前值复制到标识字段,当数据报长度超过网络的最大传送单元而必须分片时,这个标识字段的值就会被复制到所有相关数据报片的标识字段中。具有相同标识字段值的各数据报片能够正确地重新装配原来的数据报。就是分片重组时需要标识,方便后面重组

标志(3比特):标志字段最低为记为MF:MF=1表示后面还有分片数据报

MF=0表示这是若干数据报片的最后一个

中间一位记为DF,表示不能分片,当DF=0才允许分片。

片偏移(13比特):指出了较长的分组被分片后,某片在原分组中的相对位置。

IPV4编址:分组达到目的主机的过程就是不断根据IP地址转发分组的过程。设计特定的IP地址结构来高效地完成分组转发任务就称为IP编址。

分类编址:早期的编址方案成为分类编址IP地址记为

IP地址::={<网络号>,<主机号>}

网络号:表示主机所连结到的网络    主机号:表示该主机的接口。

路由器处理的只是IP得知的网络号部分,因此分为两个部分有助于加速IP寻址过程

IP地址分类:


A类地址:以0开头, 第一个字节范围:0~127(1.0.0.0 - 126.255.255.255);

B类地址:以10开头,    第一个字节范围:128~191(128.0.0.0 - 191.255.255.255);

C类地址:以110开头,  第一个字节范围:192~223(192.0.0.0 - 223.255.255.255);

(1)A类地址

A类地址第1字节为网络号,其它3个字节为主机号。

A类地址的网络号第一位固定为0,网络号只有7位可以使用,可以指派的网络号是2^7-2 = 126个。

网络号是127(0111 1111)的IP地址也是保留地址,作为本地环回软件测试。

------------------------------------------------------------------------------------------------------------------------------------------

A类地址的主机号占3个字节,每个A类网络中的最大主机数是2^24-2个。

全0表示这个子网的网络号,全1表示这个子网的广播地址

例如: 一台主机ip地址为5.6.7.8,那么该主机所在的网络地址就是5.0.0.0;而全1表示“所有的”,因为全1的主机号字段表示该网络上的所有主机

 

 

(2)B类地址
B类地址的前两个字节为网络号,后两个字节为主机号。

B类地址的网络号第一、二位固定为10,网络号有14位可以使用,可以指派的网络号是2^14-1个。

B类地址网络号为128.0(1000 000  0000 0000)的IP地址是不指派的,所以可指派的网络号需要减一。

------------------------------------------------------------------------------------------------------------------------------------------

B类地址的主机号占2个字节,每个B类网络中的最大主机数是2^16-2个。

全0表示这个子网的网络号,全1表示这个子网的广播地址

 

(3)C类地址
C类地址的前三个字节为网络号,最后一个字节为主机号。

C类地址的网络号第一、二、三位固定为110,网络号有21位可以使用,可以指派的网络号是2^21-1个。

C类地址网络号为192.0.0(1000 000  0000 0000  0000 0000)的IP地址是不指派的,所以可指派的网络号需要减一。

------------------------------------------------------------------------------------------------------------------------------------------

C类地址的主机号占1个字节,每个C类网络中的最大主机数是2^8-2个。

全0表示这个子网的网络号,全1表示这个子网的广播地址

(4)D类地址

第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicasting)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。

(5)E类地址

仅作为搜索、Internet的实验和开发之用。

IP数据包的目的地址可以是以下三种基本类型地址之一:

(1).单播:点到点的通信方式,A、B、C类地址都是单播地址类型

(2)多播:一点到多点的通信,可以将数据包交付给一组指定目的地址集合中的每一台计算机。D类就属于

(3)广播:一点到所有点的通信,广播可看成多播的一个特例

我们发现这种方式有种缺点:如果给组织一个A类地址,那么有太多主机号无法充分利用到,造成浪费。为了缓解这种浪费,我们用了新的编址方式

子网编址:

通过一个32比特的子网掩码来表示子网号字段的长度。子网编址可以用IP地址和子网掩码共同表示。其实这种形式就是通过网络号借用主机号的形式形成多个子网,缓解浪费,那么子网掩码的作用是什么呢?下面举个例子

这是一个A类地址,假设说分给的这个组织只有四个主机,那么太多IP被浪费了。

改进后

我们发现区别在于多了网络号,也就是多了网络区段,但是单独的网络区段的主机数减少了。

如何通过子网掩码来确定主机是否在当前网络区段

详细子网掩码问题请看这里:http://blog.51cto.com/6930123/2112748

为什么与之后就是所在的网络区段,因为子网掩码1的个数是网络号长度,主机号相应的位置全是0,与之后就得到了主机号为0,而网络号不会变,所以就得出了是否属于这个网络。

子网掩码实际相当于借用主机号来当做网络号使用,借用之后通过子网掩码来看借用了几位,就能得出主机号

ARP:地址映射协议:

同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址用来传输帧。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。

其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

假设每个端系统都有一个称为ARP表的高速缓存,其中存储所有端系统和路由器接口的IP地址与MAC地址的映射信息。

当端系统A想向系统B发送IP数据报时,先在主机APR高速缓存中查看是否有端系统B的相关信息,如果有直接将B的MAC地址写入帧中,发送即可,如果没有进行下面的操作

(1)两个端系统位于同一子网。

①.ARP在子网内广播一个ARP请求分组。请求的内容是我的IP地址是x,MAC地址是X,请IP地址位y的端系统告诉我你的MAC地址

②.子网中所有运行ARP进程的端系统都会收到此ARP请求分组。

③.当端系统B发现这个ARP请求分组中目的IP地址是自己的IP地址,他就将自己的MAC地址写入ARP响应报文并向A端口发送。并且把A的IP地址和MAC地址映射关系写入自己的ARP表中。而其他端系统不会相应这个请求。

④.当端系统A收到端系统B的ARP响应分组后,就会在自己的ARP中写入端系统B的IP地址和MAC地址映射

特殊情况:加入A中已经有了B的映射关系。如果端系统B换了一块网络适配器,那么B的MAC地址发生改变,原先A保存的MAC的值导致无法和B成功通信,为了解决这个问题,每个ARP表中的每个表项都设置了寿命(10~20分钟),时间超时就会将表项从ARP表中删除。

(2)如果两个端系统不在一个子网中

这种形式主要在于多了路由器的转发上。

①.A用自己的子网地址和端系统B的子网地址比较,发现两个不在同一个子网,因此端系统A与端系统E的通信是间接交付,端系统先用ARP协议获得默认网关的MAC地址将帧传送到默认网关。网关和A进行帧传输

②.此时路由器看到链路层数据帧向他寻址,就把这个数据帧向上传送到路由器的网络层。路由器的转发功能决定转发该数据的接口。

③.路由器将转发出接口和B所在的子网网络地址比较,发现B位于这个子网,则采用直接交付的形式传送数据报,路由器接口运行ARP得到B的MAC地址传送。

接下来就是回传响应分组等,路由器寻址这一步可能进行很多次

逆地址解析协议(RARP):通过MAC地址得到IP地址

这种协议往往运作在无硬盘系统,称为无盘工作站

互联网控制报文协议(ICMP):

允许端系统和路由器报告差错情况,为网络管理员提供适当的工具查询网络结点的信息。

ICMP承载于IP数据报中。

ICMP主要分为差错报文控制报文

差错报文包括:目标不可到达(网络、协议、主机、端口不可到达;禁止分割、目标网络不认识、目标主机不认识等等)、超时、参数问题、重定向(网络重定向、主机重定向等)等等

控制报文包括:请求回显(ping请求)、回显应答(ping应答)、地址掩码请求、地址掩码应答等等

运输层(运输层报文段)

网络层主要提供一个端系统到另一个端系统的数据交互,但是每个端系统都有自己不同的进程,不同的进程之间交互就是通过运输层来完成的。

在发送方,运输层接受来自应用程序进程的报文并将其转换成运输层分组,该分组称为运输层报文段。实现的方法是将应用层报文划分位较小的块,为每个块加上一个运输层首部以生成运输层报文段。

多路复用和多路分解:多个应用进程通过一个网络层传输通道进行传输,并正确的交给某个应用进程的任务

要解决的问题是如何标识应用进程和如何利用好共同的网络层传输数据报

如何标识进程:

端口:

ip地址无法表示该主机上的不同应用程序,需要另一种标识符来标识每个进程,这个进程就是端口(用来识别主机的进程)。

应用程序通过系统调用与某端口绑定后,运输层交付给该端口的数据都被相应的进程接受,而相应的进程交付给运输层的数据也要通过该端口输出。

每个端口都要有一个端口号用来区分不同的端口,端口连同主机ip能表示网络中的任何进程。注意:由于TCP和UDP服务由两个完全独立的软件模块提供的,各自的端口号也不冲突。

为了简化编程操作,通常用套接字描述网络两端进程的连接。包括通信双方IP地址,端口号及其运输层协议之间的关联。

为了使用套接字先调用本地操作系统生成它。然通过网络将套接字和对方套接字相关联,如果关联成功,主机会返回一个本地唯一的套接字,就可以通过套接字像网络收发报文了。当接受主机接受到一个数据报时,其运输层并没有直接将数据报交给应用程序,而是将其交给了一个套接字进行处理,并将其转交给享用的应用进程。

运输层多路复用的要求:①.套接字有唯一标识符,该标识符的具体格式与它是UDP还是TCP有关。②.每个报文段都有特殊字段来指示该报文段要交付的端口号。

目前端口号分为两种:

全局分配方式:由地址分配机构负责分配的端口号,这些被严格限制。

本地分配方式:当应用进程需要创建一个套接字时,回想本地操作系统申请一个端口号,操作系统返回本地唯一的端口号,该进程再通过系统调用将套接字和该端口号绑定。

在通信双方通过套接字确定了其连接之后,相关的IP地址、端口号、及使用TCP还是UDP均已确定。当某套接字接受某报文后将会先送到TCP或者UDP守护线程,TCP或UDP守护线程通过检查报文段中的目的端口号,将其定位到相应的应用程序。如果发送则相反,先赋值端口号,再交给TCP或者UDP守护进程发送。

UDP(无连接运输层协议):点到点协议

特点:①.它只是提供了多路复用/分解和轻型的差错检测功能(防止UDP报文段传输到错误的目的地)

②是无连接的,运输前不需要握手过程,因此具有较小的协议开销和发送数据之前的时延。

③.不保证可靠交付

④.没有流量控制和拥塞控制,不需要维持复杂的连接状态

⑤.UDP面向报文,应用程序交给它一个报文,他就发送一个报文。

TCP(面向连接的运输层协议):端到端协议

①.TCP是面向连接的端到端协议,发送方在向接收方发送数据之前,必须通过三次握手来协商数据传输的参数。

②.TCP连接是点到点的

③.TCP提供全双工 服务

④.TCP提供可靠的交付服务

⑤.TCP连接采用的是客户/服务器模式。发起连接的是客户机进程,而提供服务的是服务器。

⑥.面向字节流:TCP把进程交来的数据看作是一连串无结构的字节流。

TCP为什么安全、可靠:

数据序号和确认号

超时重传

流量控制:是TCP接收方对TCP发送方采取的措施

拥塞控制:TCP发送方针对网络拥堵采取的措施

 

 

UDP如何实现可靠:

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。

TCP报文段结构:

源和目的端口号:这些字段被用于多路复用/分解来自或送到上层应用的数据

序号字段(seq)和确认字段(ack):假设要传输一个数据流是10000字节的文件,MSS(最大报文段长度)为1000,那么我们把这数据流分为10个数据报,第一个数据报的序号为0,第二个数据段序号为1000,最后一个数据段序号为9000,每个序号被填入到相应的TCP报文段首部的序号字段中。因为A和B是双工通信,所以当A向B发送序号为1000的数据报时,还想要让B给A返回序号为2000的数据报,那么此时A向B发送的TCP中把2000赋给ack交给B,B收到后给A返回数据序号为2000的数据报,并且写入自己的想要的数据报序号也就是确认序号(ack)。

从上可知:TCP把数据报看成了无结构但有序的字节流。由于一个报文段的序号是该报文段字节流的首字节序号。因此TCP对序号的使用是建立在传送的字节流上。并且TCP的高效载答机制,因为ack只是发送捎带传输的,并没有专门传输,而且收到了对方的下一字节的确认号,说明上一传输的字节已经确认收到了。

TCP报文传输

TCP三次握手协议:

å¾çæè¿°

三次连接建立有如下几个目的:首先,要使双方都知道对方已经准备好了。其次,双方要协商如最大报文段长度、最大窗口长度和服务质量等。第三分配和初始化缓存长度、各状态变量和连接表中的表项等运输实体资源。

第一步相当于告诉B我要传输了。

第二步相当于B告诉A我接收到了你的信息

第三部相当于A告诉B我收到了你的确认信息了

服务端首先需要被动打开,是服务器处于LISTEN状态。,准备接受客户机进程的连接请求。

SYN(SYNchronization) : SYN表示建立连接,

ACK :ACK表示响应,

如果只是单个的一个SYN,它表示的只是建立连接。

 

首先由Client发出请求连接即 SYN=1 ACK=0 (请看头字段的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x
然后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y, ack=x+1,
再然后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1.然后连接建立。

有人会困惑为什么要进行三次握手呢(两次确认)?这主要是为了防止已失效的请求连接报文忽然又传送到了,从而产生错误。如何产生这种情况的呢?假定A向B发送一个连接请求,由于一些原因,导致A发出的连接请求在一个网络节点逗留了比较多的时间。此时A会将此连接请求作为无效处理又重新向B发起了一次新的连接请求,B正常收到此连接请求后建立了连接,数据传输完成后释放了连接。如果此时A发出的第一次请求又到达了B,B会以为A又发起了一次连接请求,如果是两次握手此时连接就建立了,B会一直等待A发送数据,从而白白浪费B的资源。三次握手的话,由于A没有发起连接请求,也就不会理会B的连接响应,B没有收到A的确认连接,就会关闭掉本次连接。

TCP的四次挥手:

终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放

1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。

2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。

3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。

4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。

为什么要四次挥手:

最后一次B给A传输说明B完成传输要关闭连接,A再次发送ACK是为了告诉B我知道你要关闭了,那么我就关闭了,如果没这个确认无法知道A是否接收到了B的关闭请求

A为什么等待2MSL,从TIME_WAIT到CLOSE?

 在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

 

会话层:建立、管理和终止会话(会话协议数据单元SPDU)

 

表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)

但是我这里记录的是TCP/IP模型,所以只有5层模型。

应用层:定义了某类应用程序进程之间的通信规则

域名系统(DNS):是一种进行网络资源到IP地址转换的网络应用。

DNS工作原理:

DNS的域名服务器在网络中提供一种解析机制,向它发送包含主机名的报文就能查询到该主机对应的IP地址

DNS采用了分布式的设计方案。使得系统有很高的效率,并且不会相互影响,DNS运行在UDP53端口上。

工作过程:1.某应用程序请求将主机名解析为IP地址,则将该应用进程将待解析的域名放入DNS请求报文。客户机发送的每条查询信息包括三条信息:包括:指定的DNS域名,指定的查询类型,DNS域名的指定类别,以UDP报文段方式发送给本地域名服务器

2.本地域名服务器查找域名映射后,把对应的IP地址放在应答报文中返回。应用程序通过目的主机IP地址后即可通信

3.如本地域名服务器找不到相关信息,则此域名就会成为DNS中的一台客户机,并向上级域名服务器发生查询请求。

HTTP(超文本传送协议):

是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

超文本(Hypertext)是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。

HTTP的工作过程:

HTTP使用TCP作为它的支撑运输协议。TCP为HTTP提供可靠的网络传输服务。

为了简化操作HTTP被设计为一个无状态协议。这意味着WEB服务器和客户机都不会记忆上一次HTTP的交互情况,比如说用一次HTTP完成了注册,但在下次交互中服务器会忘了一起,这使后继的HTTP交互难以正常进行。

尽管HTTP无法解决这种问题,但是Web系统开发工具却提供了将相关HTTP关联起来的Session对象。当用户在应用程序页面跳转中,Session对象中的变量不会被清除,使系统能知道那些HTTP操作属于同一个会话。同时使用同一个会话的HTTP使用的相同的源IP地址和端口号,而且Web服务器总是打开的。并且具有一个固定的IP地址和默认的端口号80。

非持续连接和持续连接:

(1)持续连接:请求/响应都经过相同的TCP连接进行发送。效率会很高,这种称为持续连接

    ①。无流水线持续链接:仅当前面的响应已经收到时,客户机才会发出新的请求,这使每个对象都有一个RTT时延

    ②。有流水线的持续连接:只要客户端遇到一个引用对象,他就发送请求,对于所有请求对象只有一个RTT时延

    RTT(往返时延):计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。

(2)非持续连接:这种将每个请求/响应都经过一条单独的TCP连接发送的方式叫做非持续方式。

 

HTTP客户机和服务器在默认方式下均使用持续连接的方式,但也能将他们配置成使用非持续连接的方式。

第一种方式虽然时延多,但是第二种服务器压力过大。

我们要说说流水线是如何实现的。

我们的流水线式是发送方不等待响应,也就是不等待ack,发送方继续发送数据。

就是因为ack我们才能保证tcp的传输可靠性,但是既然不能立即得到ack保证可靠,我们就要用新的东西来保证可靠。

那就是:选择重传和回退n步

回退n步

如果我们的一直发送数据,突然有部分没发出去,那时我们就要去重新发送这部分之后的数据,就算这部分数据已经发送了。

但是这里还设置了一点,如果ack在发送的过程中丢失了(检测是否都是通过设置一个时延,时延过了没收到就凉了)。比如a,b都发送到了,a的ack丢失了,b的ack发送到了,因为发送方知道b是后发的,所以能确定a已经发到了。有人说如果a没法呢,收到b,首先a如果没收到数据,b也就不会发ack;

选择重传

但是,如果出错我们就回传到出错的前一个到目前所发的,那么会浪费时间,提出来了选择重传协议,如果收到了数据,就算它之前的没收到,我们只发之前的,不用重发所有。

看篇文章:只是这里没用选择重传。https://blog.csdn.net/yao5hed/article/details/81046945

发送窗口的大小由接受方的接收窗口和拥塞窗口共同决定

接受窗口可以告知发送方接受方的接受缓存有多大

 

再说说滑动窗口协议:其实上面两个方法依赖于滑动窗口协议,窗口就是个区,限制了发送方发送的大小,和接收方接受的大小,每次可以按照窗口的大小发送它,也可以避免重传过多,而且一个ack丢了,也可以根据下一个ack来判断上一个数据是否被成功接受,如果一个数据被接受到,我们就左移它,使这个数据不再处于滑动窗口中,那么这个数据就不会被发送,所以说窗口用来定义发送的边界和容量。那么超时重传协议如何利用它呢,我们通过窗口的边界就能判断出要从哪里起开始传起。

滑动窗口还有个功能就是流量控制功能,为什么,其实滑动窗口的大小总是可变得,如果我第一次传了3个数据,结果第三个没被接收到,说明网络可能拥塞或者造成丢失,因此我们减慢发送速度,将滑动窗口设置为2.这样解决了拥塞问题,tcp的流量控制就是依赖于此,流量控制是发送方通过接收方的反馈而改变窗口大小解决的,

放个帖子https://www.cnblogs.com/luoquan/p/4886345.html

而拥塞控制是通过发送方针对网络拥堵采取措施,
  拥塞窗口:发送方为一个动态变化的窗口叫做拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度。发送方让自己的发送窗口=拥塞窗口,但是接受窗口不是一直等于拥塞窗口的,在网络情况好的时候,拥塞窗口不断的增加,发送方的窗口自然也随着增加,但是接受方的接受能力有限,在发送方的窗口达到某个大小时就不在发生变化了

其实就是:我们的拥塞窗口也是用来限制能发送多少数据的,接受窗口也是这么干的

只不过拥塞窗口是根据网络中设备的负载能力改变的,而接收窗口是通过接收方的接受效率反馈的

那么到底发送方的发送窗口到底该发送多少呢:我们发送选择拥塞窗口和接收窗口的最小值,最为发送窗口的大小

慢启动:就是一开始我们发很小的数据,去探测网络承载能力,然后以指数形式增加,到达一定阈值就变成线性增加,当拥塞时用,我们再用相应的算法去减少发送量

 

 

HTTP报文格式:

请求报文:

该报文是用ASCⅡ文本书写的。由六行组成

请求行:方法、url、HTTP版本。

方法:就是对所请求的对象进行的操作,请求报文的功能由它所采用的方法决定,有这么几种方法

1. GET :请求读取URL所标识的信息

2. POST :给服务器添加信息

3. PUT;在指定URL下存储一个文档。

4. OPTIONS :请求一些选项的信息

5. HEAD :请求读取URL所标识的信息的首部

6. DELETE: 删除指定URL所标识的信息

7. TRACE :用来进行环回测试的请求报文。

8. CONNECT 用于代理服务器。

GET和POST的区别:

1、get是从服务器上获取数据,post是向服务器传送数据。
2、在客户端, get方式在通过URL提交数据,实体主体为空,数据在URL中可以看到;post方式,数据放置在实体主体内提交
3、get方式提交的数据最多只能有1024字节,而post则没有此限制
4、安全性问题。正如在2中提到,使用get的时候,参数会显示在地址栏上,而 post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get ;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好

下面是一个典型的请求报文:

(请求行)GET /chn/yxsz/index.htm HTTP/1.1    请求行方法为get,URL为/chn/yxsz/index.htm  HTTP版本为1.1

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

(首部行)HOST:www.mySchool.com   首部字段名定义了对象所在的主机 

(首部行)Connection:close     浏览器不希望服务器使用持续连接

(首部行)User-Agent:Mozilla/5.0  浏览器的类型是Netscape浏览器

(首部行)Accept-Language:cn  用户希望得到对象的中文版本

响应报文:每个请求报文发出后,都能得到一个响应报文。

 

状态行:

①.HTTP

HTTP1.0:只支持非持续的连接                HTTP1.1:支持持续连接(默认带流水线的)

HTTP1.0在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)

HTTP1.1:但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域

1.1还加入了host域名,用于区分一个服务器的多个ip

HTTP1.1 HTTP 2.0主要区别:

多路复用


HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

数据压缩


HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

 

 

  HTTPS和HTTP的区别主要如下:

  1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

  4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

HTTP状态码分类
分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

 

③.解释状态码的简单短语。

一个请求报文状态行

HTTP/1.1 202 Accepted //报文版本为1.1,这是个接受信息响应报文。

cookie:Web站点跟踪用户的技术

cookie过程:

1.首次登陆一个页面时,Web网站也将产生一个唯一的识别码如1515,并以此为索引在网站后端数据库产生一个表项。

2.Web服务器用一个包含Set-cookie:首部行的HTTP响应报文对客服的浏览器进行响应,其中Set-cookie:首部行标识符为由1515,当客户收到时,并为特定的cookie文件加上一行。该行包括主机名和识别码1515.

3.当客户再次访问服务器时,请求一个web页面,其浏览器就会从cookie文件中获取客户对这个网站的识别码,并放到HTTP请求报文中的标识码的cookie首部行中。

这样服务器可以跟踪客户。

Session:

https://baijiahao.baidu.com/s?id=1569587264497242&wfr=spider&for=pc

Session信息是存储到服务器端的,但是不同的浏览器可能在服务器上都存储了属于自己的Session信息,但是浏览器怎么去寻找属于自己的Session呢。

就如同,我们去公安局查信息,我们只需要输入自己的身份证号就可以匹配到唯一的身份证信息。Session机制也是这样的,浏览器在访问服务器的时候,将自己的sessionid给服务器,服务器就可以根据这个ID去匹配查找Session信息。由此,我们推断出在服务器端,Session的存储机制是key=value的形式,我们可以保证key一定是sessionid,但是value的存储方式可能有很多种,在这里我们不做过多的讨论。

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,

我们常用的Session实现方式有哪几种。

第一种:就是依赖于Cookie的实现,就是上面我们所说的那种,在这里我就不赘述了。

第二种:URL重写。这种实现方式,是通过在请求的URL后面后缀JESSIONID=xxx这种方式将JESSIONID传递给客户端。

第三种:隐藏的表单域。就是在FORM表单中,设置一个隐藏域,将JESSIONID放置其中,一并发送给服务器端。

当然,第一种方式是目前的主流,但是浏览器必须要支持Cookie,如果浏览器禁用Cookie,那么可以考虑第二种或第三种实现方式!

Session的缺点

没有任何一种技术是完美无瑕的,任何一种技术都有它的优缺点,Session也不例外。据我所了解的,Session的缺点就一下几点,欢迎大家补充:

1、如果Session的实现是依赖于Cookie的话,那么浏览器必须要支持Cookie,否则歇菜。

2、过多的浏览器请求,会在服务器端创建很多的Session信息,会对浏览器造成一定的内存压力,而且不易于维护。

目前,我知道的就这两点!

好了,今天我们主要说了一下Session的一些东西,总结起来以下几点:

1、Session存在于服务器端,不同于Cookie.

2、如果Session的实现是依赖于Cookie的实现,浏览器在多次访问服务器端时,会在请求报文中的Cookie属性中添加JESSIONID=123,作为到服务器端检索属于自己的Session信息的唯一ID.

3、SESSION的实现方式有很多:有依赖与Cookie实现、URL重写实现、隐藏表单域实现!

FTP(文件传送协议):运行在TCP,使用了两个并行的TCP传输文件,一个控制连接,一个数据连接,首先发起一个控制连接,从该链接收到命令时,再建立一个数据连接然后发送数据,发完关闭。

SMTP(简单邮件传送协议):规定了两个相同通信的SMTP进程之间如何交互信息

SNMP(简单网络管理协议):SNMP网络管理体系有3个重要组件:一个管理实体,多个被管设备和一个网络管理协议

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值