【大话存储】学习笔记(11章),TCP/IP
TCP/IP协议
以太网的出现,给系统的互联带来方便的方式,每个节点安装一块以太网适配器,上层程序只要将发送的数据以及目的MAC地址告诉以太网卡,就可以完成通信过程。
但是实际上,以太网不能直接被应用程序用来收发数据的,因为以太网是一个没有传输保障的网络。
表现在:
- 不会对数据帧进行校验纠错。
- 如果交换量大,可能会出现缓冲区队列满了的情况,所以以太网会主动丢弃,并且不会通知发送者。
正因为如此 ,需要上层程序来获得可靠数据。
比如NetBEUI,NetBIOS,IPX,TCP/IP,这些协议其下层调用以太网提供的服务,上层对外提供新的调用接口。
而TCP/IP因为适用广,性能好,可以在超大规模的网络上运行,迅速得到普及。
IP协议
作用一:屏蔽链路层地址
以太网主要实现了OSI的下三层,即物理层、链路层、网络层,现在普遍认为以太网只作用到了链路层,这种误解的原因是以太网与TCP/IP结合就沦落为TCP/IP的链路层,其第三层地址被以太网IP所映射掉了。
而且以太网定义了MAC地址,也有自己的物理层,完全可以用来进行寻址。但是为什么没有完全靠MAC来寻址呢?因为
-
首先MAC 太长,48bit,用于路由寻址的时效低。
-
最关键的是,世界上不是每个环境都用以太网来建立网络,还可以有其他的网络系统,有其他的寻址方式。
比如以太网适合局域网通信,但是不适合广域网,一般来说广域网有专门的的联网协议,比如PPP , HDLC , FrameRelay , X25 , ATM等,它们也如以太网一样各有各的寻址体系。
在一个Internet上有如此多的不同类型的网络,如果要联通,需要各种转换,映射。所以最好才解决方案是给他们通通分配一个IP地址给每个节点,对外以IP地址作为寻址地址,再将IP地址映射到所在网络的地址上,比如IP映射到Frame Relay 的DLCI ,映射到ATM的地址等。
以太网天生的弱点导致它必须向TCP/IP合作,而且只能将MAC地址隐藏,对外通通使用IP地址。
总结一下,因为除了以太网以外,还有很多其他类型的联网方式,而几乎所有的联网方式都有自己的编址和寻址方式,为了兼容,只能将地址全都映射到IP地址上
既然有映射,当然需要一种协议来完成这个过程。那就是ARP协议,这个协议就是用来处理一种地址和另一种地址的映射。运行在每个网络设备上,将一种地址映射成底层网络设备所使用的另一种地址。
每种网络要想用IP来统一就必须运行各自的ARP协议,比如以太网的ARP , 帧中继的ARP。
ARP协议:主要用来将IP地址映射到底层设备的地址(MAC地址)
我们以浏览器中输入网络域名之后发生的事情来举例。
-
首先DNS兑换程序自动向DNS服务器查询,获得域名对应的地址,然后用IP地址与服务器通信。
-
数据包带着IP地址到了服务器所在的局域网,会通过局域网的路由器发出的ARP请求,将IP地址兑换为服务器所在局域网的地址,
-
如果服务器所在的局域网是以太网,则对应成MAC地址,然后通过以太网交换设备,找到此MAC地址所在的交换机端口,将数据包发向这个端口。
上述过程发生了两种不同的兑换:
-
IP转换为域名,这是因为IP不方便记忆,所以我们平时使用类似"www.baid.com"这样的字符来表示网站,当然需要在后台将域名和IP进行相互转换。
-
MAC转换IP:为了统一。
作用二:适配上下层
IP层另外的作用是适配上下层:给链路层和传输层提供适配。
链路层有MTU的概念:链路的最大传输单元,即每帧所允许的最大字节数。
链路层就类似司机和交通规则,对货车的载重、大小有要求,如果货物太大,就必须分割。这个动作是由IP层程序来做,也就是IP根据链路的MTU来分割货物,然后贴上源目的IP地址、顺序号。
路由器每次选择的路径不一样,所以到达目的地以后可能乱序了,此时可以使用顺序号。这个顺序号是根据分割处相对起点的距离,根据这个号,等所有货物到达了以后,对方的IP程序可以将这个号码组装起来。
每个货物块都携带IP头,但是只有第一块携带TCP头部 。因为传输层头部是在应用数据之前的,所以IP在分割的时候,一定会把头部分到第一块中。
缺点
IP最大的作用是寻址和路由,以及适配链路层的MTU。但是以太网是个面向无连接的网络, 不保障数据一定会传送到对方。
Frame Relay协议,其前身X.25协议,有很好的传输保障功能,因为其设计初衷是为了运行在不稳定的链路,当链路的质量不断提升,x25的做法有些多余,所以在FR替代了X25,只留下流控机制。
但是以太网和FR都没有实现端到端的传输保障。端到端是相对于“过路”而言的。过路是指在两个终端之间通信路径上的网络设备之间的路径。链路层只保障两个设备之间传送的数据无误,但是不能保证最终终端传输的无误。
TCP和UDP
TCP/IP协议包含两个亚层:
- IP:统一底层网络地址和寻址
- TCP或者UDP:逻辑上位于IP上。
TCP和UDP的功能
-
TCP功能:维护复杂的状态机,保障发送方发出的数据包都会传送到接收方。出错的话,则反馈信息。
-
UDP功能:TCP/IP对以太网的透传。没有传输保障功能的亚层。除了UDP可以提供比以太网更方便的调用方式,其他没有本质区别。
TCP/IP协议向应用程序呈现的接口就是Socket接口,即插座接口。TCP/IP想让应用程序更方便的使用网络,就像插头插入插座一样。
基于TCP/IP的应用程序,必须依赖于TCP/IP协议,如Ping , Trace , SNMP,Telnet , SMTP,FTP,HTTP
这些协议加上IP、TCP等,然后加上物理层链路层(以太网等),形成了TCP/IP协议簇。
所以说TCP运行在终端上,监控终端最终发送的接收的数据包的顺序、缓存区、校验。
TCP协议
TCP就是个押运员,是由它把货物交给IP做调度的。
货物最初是由应用程序生成,调用Socket接口向接收方发送货物。通告TCP/IP去特定的内存区将数据复制到Socket缓冲区,然后TCP再从缓冲区将数据通过IP层分片之后,从底层网络适配器发送到对端。
TCP通过MSS(max Segment Size)来调整每次转给IP层的数据大小。而MSS值完全取决底层链路的MTU。
为了避免IP分片,MSS总等于MTU值减掉IP头,再减掉TCP头的值,TCP发送给IP的数据,IP加上IP头之后,恰好等于底层链路的MTU值,使得IP不需要分片。
TCP将上层应用的数据完全当成字节流,不进行定界处理,认为上层应用数据就是一连串的字节,不认识字节的具体含义,却可以分割这些字节,封装成货物进行传送,但是必须保证数据排列顺序。
TCP将上层数据“分段” , IP将TCP分段再“分片”(若此段大于MTU)
IP到达目的地以后,会将分片合并为分端,然后放到货仓,顺序排放,不管上层消息的分界。
UDP协议
UDP只是被动的起到了一个IP和上三层的接口的作用。
没有出错重传,没有缓冲、定时器、状态机,而且也不会像TCP将数据流分段,适配MTU的工作完全由IP来做。
没有握手机制,所以UDP头部只有8个字节长,包括目的和源端口号,UDP数据包长度、UDP校验和,效率高。所以UDP协议一般用于实时性高的地方,比如视频流
端口号
OS上运行N个程序,如果需要通信,可以使用号码来标识,所以只要知道了进程号就可以区分程序。
同一PC上的程序通信,一般是在内存中直接通信,但是如果两台计算机的两个程序都需要通信,若用内存共享,成本太高,所以可以采用先发送到另一台计算机,然后让接收消息的计算机将这个消息发送给对应的程序。
所以接收方的OS中的TCP/IP协议必须知道某个数据包应该放到哪一个应用程序的缓冲区,因为同一时刻可能有多个应用调用Socket 进行数据收发。
为了区分正在调用Socket的不同应用程序,规定了端口号。
所以在调用socket的时候,必须声明连接目的计算机TCP/IP协议的那个端口号。
TCP/IP与以太网的关系
有人把TCP/IP与以太网等同起来,是完全错误的。
TCP/IP与以太网是互相利用,而非相互依存。
TCP/IP协议不像以太网有底层专门的硬件,绝对是可以租用一切合适的硬件来作为物理和链路层。
比如TCP/IP可以用无线、USB、COM串口、ATM作为物理层和链路层。
以太网有自己的网络层编址和寻址,有网络层的元素
TCP/IP在网络层和传输层的功能应用太广泛了,所以OSI的第三和第4层几乎是被TCP/IP统治了。