转载:软件工程师的视角看网络(网络那点事)

http://blog.csdn.net/bxyz1203/article/details/7463251

觉得这篇文章讲的很详细很好,转载。。。

一、概述

     在以太网中,我们都很清楚网络的分层模型,ISO模型7层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。TCP/IP模型四层协议:主机至网络层、互联网层、传输层、应用层。 在实际应用中我们都是用TCP/IP的模型。下面我讲下软件设计需要了解的网络知识,个人感觉软件工程师应该知道这些知识的,当然也是些基础的网络知识。主要从从物理层、数据链路层、互联网层、传输层、应用层的角度。 对于网络设备,集线器工作在物理层;2层交换机在链路层;3层交换机在网络层、链路层;路由器在网络层;负载均衡一般是在传输层,也有应用层、网络层、链路层的。防火墙也一般是穿层。不过,以上也不是绝对的。现在的一些设备基本没有固定的层次,基本都是穿层的。
 
以下这张图是经典的网络逻辑图:

 
数据是一层一层封装的。如下图所示:

 
二、物理层
物理层涉及到通信信道上面传输的原始的数据位。简单地讲,怎么用电压表示0或者1。也涉及到传输介质的问题。磁介质有:双绞线、同轴电缆、光纤。还有无限传输等问题。其中也涉及到著名的香浓定理。不深入讲,软件设计人员涉及较少。
 
三、数据链路层
将一个原始的传输设施转变成一条逻辑的传输线路。主要是将上层的数据拆开,分装到数据帧中,然后顺序的发送。其中涉及到怎么成帧、错误控制、流控制、检测与校验。IEEE将数据链路层划分为逻辑链路控制LLC(Logical Link Control)子层与介质访问控制MAC(Media Access Control)子层。介质访问控制子层:MAC(Medium Access Control)子层,这个就存在大家熟悉的mac地址,48位,也就是熟悉的网卡地址。此子层可以是多播与广播的帧给网卡的。基本的技术就是CSMA/CD。LLC基本就是提供一个标准化的接口给网络层了。
Internet是用PPP(point-to-point Protocol)作为点到点线路的基本数据链路协议。此协议中涉及到一个重要的数据:MTU(Maximum Transmission Unit,MTU),默认是1500,此数据在网络编程数据传输中还是很重要的。
 
 
四、网络层
控制子网的运行,在以太网中,最重要的数据协议是:IP协议。其他的传输拓扑协议,如:OSPF、BGP我们不关心。ipv4协议:其中Source IP Address就是源地址。
 
IP地址分为:网络段+主机端 一个网络段就代表一个子网。这个可以参考:
http://en.wikipedia.org/wiki/IP_address
 
IPv4地址是非常缺乏的,这个跟当时的设计有关系。为此引入了NAT,此有很多争议,但是这个解决ipv4的ip缺乏问题,也不乏是一个好的方案。
以下是其中的一种结构,简单地讲就是:就是把无连接的网络做成了面向连接的网络。引入了传输层端口的概念。
 
另外还有:ARP(address resolution protocol)\RARP(reverse address resolution protocol)
DHCP(dynamic host configuration protocol)
 
五、传输层
是协议层次的核心所在,它的任务是在原机器和目标机器之间提供可靠的、性价比合理的数据传输功能,并且与当前所使用的物理网络完全独立。他是端到端的,与点到点的最大的区别是跨网络。
传输层的核心概念.socket,端口的概念。在一些操作系统低于1024是有特别用途的。
用途最广的是TCP协议:
TCP的Header如下所示:
 
到传输层,才有了连接的概念了。在传输层以下是不用面向连接的(也就是直接扔包,直接存储转发掉。),第一张图,data flow基本说明了传输层的含义。
TCP连接连接建立需要三次握手,断开连接是四次握手【因为TCP是双工的,断开需要一方申请且另一方确认的,连接的时候可以把sync、ack合为一个】。如下是 TCP链接管理有限状态机: 
以下是握手及断开的过程,参考上图看:

 
六、应用层
就是实际的网络应用了,这里就千奇百怪了,想深入了解那块,就google吧。目前大约有:DNS、e-mail、万维网(其中涉及http)等等。。。
大部分的软件从业人员都工作在此层的。
 
有一些应用就用传输层低于1024的端口,如 HTTP的80端口。当然这些都可以更改,没有绝对的。
 

七、一个关于传输层连接的例子

我从家的机器访问公司的网络,通过netstat查看得到:
client的情况为:
家里路由器的出口ip为:60.176.147.50(中国电信的租用地址)
公司服务器的情况:
为此我画了以下的拓补图:(我们这里还是非三角模式,就不是修改mac地址的。)
主要解释下连接的事情,连接是传输层的事情。下层是不存在的连接的事情。为什么存在端口,原因还是应用层程序通过监听端口来区分不同的线程的。
 
从client上发起与服务器的三次握手连接后,连接建立起来,但是双方的目标ip都不是对方的ip。怎么建立的呢?图中也给出一些答案。
这个关键的就是NAT做了手脚。建立连接本质就是要分析tcp的数据包,当发现发给我的数据包后,应答的时候,就把源地址目标地址互相换下,再发给对方。其实发送方并不知道数据包是否真的发给了对方。
 
八、参考资料
大学课程《计算机网络》第四版
 
九、特别说明:
     大部分的图片来自网络,特别是wikiped。作者:阿里巴巴封神悟
原文地址:https://www.cnblogs.com/chateldon/p/2473219.html