Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

计算机网络 #16

Open
Alexandermclean opened this issue Mar 16, 2019 · 0 comments
Open

计算机网络 #16

Alexandermclean opened this issue Mar 16, 2019 · 0 comments

Comments

@Alexandermclean
Copy link
Owner

作为前端还是需要知道关于计算机网络的一些协议知识的

1.计算机网络协议架构

OSI(Open System Interconnect)开放式系统互联,一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型。
最早的时候网络刚刚出现的时候,很多大型的公司都拥有了网络技术,公司内部计算机可以相互连接。可以却不能与其它公司连接。因为没有一个统一的规范。计算机之间相互传输的信息对方不能理解。所以不能互联。
ISO为了更好的使网络应用更为普及,就推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。

不同协议在最初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 物理层 例如线路、无线电、光纤、信鸽

第7层应用层—直接对应用程序提供服务,应用程序可以变化,但要包括电子消息传输;
第6层表示层—格式化数据,以便为应用程序提供通用接口。这可以包括加密服务;
第5层会话层—在两个节点之间建立端连接。此服务包括建立连接是以全双工还是以半双工的方式进行设置,尽管可以在层4中处理双工方式;
第4层传输层—常规数据递送-面向连接或无连接。包括全双工或半双工、流控制和错误恢复服务;
第3层网络层—本层通过寻址来建立两个节点之间的连接,它包括通过互连网络来路由和中继数据;
第2层数据链路层—在此层将数据分帧,并处理流控制。本层指定拓扑结构并提供硬件寻址;
第1层物理层—原始比特流的传输,电子信号传输和硬件接口数据发送时,从第七层传到第一层,接受方则相反。

上三层总称应用层,用来控制软件方面;下四层总称数据流层,用来管理硬件,数据在发至数据流层的时候将被拆分。根据PDU (协议数据单元):在传输层的数据叫段(segment),网络层叫包(packet),数据链路层叫帧(frame),物理层叫比特流(bit),其他更高层次的数据则是报文(message)

OSI中每一层都有每一层的作用。比如网络层就要管理本机的IP的目的地的IP。数据链路层就要管理MAC地址(介质访问控制)等等,所以在每层拆分数据后要进行封装,以完成接受方与本机相互联系通信的作用。

2.下层协议

互联网是由一整套协议构成的,规定了在不同通信层的要求。

1.Ethernet(以太网)

互联网中最底层的是以太网协议,它规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。

2.IP协议

上面的以太网协议可以解决一个局域网内的点对点通信,但是不能解决不同局域网之间的通信,IP协议就是为了解决这种情况。

ip_protocol

如上图所示,IP协议可以连接多个局域网

IP协议定义了一套自己的地址规则,称为IP地址。它实现了路由功能,允许某个局域网的A主机向另一个局域网的B主机发送消息。
我们买的路由器就是基于IP协议,局域网之间需要靠路由器连接;路由器背部有很多网口,其内部有一张路由表,规定了A段IP地址的出口a,B段IP地址的出口b......通过这套“指路牌”实现了数据包的转发。

ip_table

这张路由表注明了不同IP段目的地的数据包,要发送到哪个端口(interface)

IP协议只是一个地址协议,并不保证数据包的完整,如果路由器丢包(路由器内存满了,新进来的数据包就会丢失),就需要发现哪一个数据包丢失,以及重新补发这个数据包。这就需要依靠TCP协议了。
简单来说,TCP协议的作用就是保证数据通信的完整性和可靠性,防止丢包。

3.TCP协议

1.数据包大小

以太网数据包(packet)大小是固定的,最初是1518个字节,后来增加到1522个字节。其中1500个字节是负载(payload),22个字节是头信息(head)。
IP数据包在以太网数据包的负载里,也有自己的头信息,最少需要20字节,所以IP数据包的负载最多是1480个字节。

packetsize

IP数据包在以太网数据包负载里,TCP数据包在IP数据包负载里

TCP数据包在IP数据包的负载里,它的头信息最少也需要20个字节,因此TCP数据包的最大负荷是1460个字节。由于IP协议和TCP协议往往有额外的头信息,所以实际的TCP数据包大概是1400个字节。

packet_simple

2.TCP数据包编号(SEQ)

一个包1400字节,那么一次性发送大量数据,就必须分成多个包。比如,一个10MB的文件,需要发送7100多个包。
发送的时候,TCP协议为每个包编号(sequence number,简称SEQ),以便接收的一方按照顺序还原。万一发生丢包,也可以知道丢失的是哪一个包。
例如第一个包的编号是一个随机数。为了便于理解,这里就把它称为1号包。假定这个包的负载长度是100字节,那么可以推算出下一个包的编号应该是101。这就是说,每个数据包都可以得到两个编号:自身的编号,以及下一个包的编号。接收方由此知道,应该按照什么顺序将它们还原成原始文件。

tcp_length

当前包的编号是45943,下一个数据包的编号是46183,由此可知,这个包的负载是240字节。

3.TCP数据包的组装

收到TCP数据包以后,组装还原是操作系统完成的。应用程序不会直接处理TCP数据包。对于应用程序来说,不用关心数据通信的细节。除非线路异常,除此之外收到的总是完整的数据。应用程序需要的数据放在TCP数据包里面,但要把TCP数据变成应用层可识别的数据,就要有自己的格式(比如HTTP协议)。

TCP并没有提供任何机制,表示原始文件的大小,这由应用层的协议来规定。比如,HTTP协议就有一个头信息Content-Length,表示信息体的大小。对于操作系统来说,就是持续地接收TCP数据包,将它们按照顺序组装好,一个包都不少。操作系统不会去处理TCP数据包里面的数据。一旦组装好TCP数据包,就把它们转交给应用程序。TCP数据包里面有一个端口(port)参数,就是用来指定转交给监听该端口的应用程序。应用程序收到组装好的原始数据,以浏览器为例,就会根据HTTP协议的Content-Length字段正确读出一段段的数据。这也意味着,一次TCP通信可以包括多个HTTP通信。

4.发送窗口

接收方每收到两个TCP数据包,就要发送一个确认消息。“确认”的英语是 acknowledgement,所以这个确认消息就简称ACK。

ACK 携带两个信息:

1.期待要收到下一个数据包的编号
2.接收方的接收窗口的剩余容量

发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为“发送窗口”,这个窗口的大小是可变的。

seq_ack

上图的传输步骤:
client:我想要下一个数据包的编号是1,长度是360个字节

server:数据给你,下个数据包的编号是361,我的发送窗口最大是120bytes

client:我想要下一个数据包编号是361,长度是120个字节(按照你的要最大限度)

server:数据给你,下个数据包的编号是481,我的发送窗口最大是120bytes

...

我自己总结了一下SEQ和ACK的含义:
SEQ是我这次要从哪个编号开始要数据;ACK是我下次要从哪个编号开始给数据

5.数据包丢失处理

TCP协议可以保证数据通信的完整性,这是怎么做到的?
前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么ACK的编号就不会发生变化。

举例来说,现在收到了4号包,但是没有收到5号包。ACK就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮ACK会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么ACK里面的编号不会变化,总是显示5号包。这会导致大量重复内容的ACK。
如果发送方发现收到三个连续的重复ACK,或者超时了还没有收到任何ACK,就会确认丢包,即5号包遗失了,从而再次发送这个包。通过这种机制,TCP保证了不会有数据包丢失。

tcp_lost

hostB没有收到100-120这段编号的数据包,会重复发ACK=100,触发hostA重发数据包

@Alexandermclean Alexandermclean added this to 什么都有 in daily record Mar 16, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
daily record
  
网络基础
Development

No branches or pull requests

1 participant