一、基础知识,网络设备功能及原理介绍:
1.计算机网络:
通过各种不同的通信设备和线材介质将处于不同地理位置且功能独立的多个计算机系统连接起来,然后通过成熟完善的网络软件体系如网络协议(TCP/IP)或网络操作系统实现网络中资源共享和信息传递的系统。
2.网络分类:
从分类的角度不同,有多种不同的划分方式。
1).按规模划分:
局域网、城域网 和广域网(Internet)。
2).按使用功能划分:
(1)对等网:没有明显的客户机和服务器的区分,相互共享/访问资源,相互验证安全;缺点是不易于统一的管理资源和验证。(2)服务器-客户端(C/S模式):服务器为整个网络提供需求服务,这种方式易于管理资源和验证,但开销比较高,服务器配置比较高。服务器因功能不同而叫法不同,如文件服务器,邮件服务器,病毒防御服务器等。
3.网络拓扑结构:
总线型、星形和环形结构(通过中间的多站访问单元,构成逻辑上是令牌环路,而不是直接将主机首尾链接形成环形,这样没有竞争机制,网络稳定性好)。
4.MAC地址:
计算机网络中的硬件地址,用来定义网上设备的位。属于OSI模型的数据链路层,该地址被烧录到网卡的ROM中,因此,这个地址是不能变的,在出厂的时候由厂商决定了(前24位是机构唯一性标示符(OUI),由专业机构分配,后24位又厂商指定),因此一个网卡有一个全球唯一的MAC地址。因为定的标准不同所以MAC的第一位或最后一位称为“I/G”位,I/G全称是“Individual/Group”,如果这个MAC是单播的,则该位置0,如果这个MAC是广播或者组播的,则该位置1。
5.IP地址:
网络通讯领域里,IP地址是为了确定一个具有网络设备或网络计算机所处的具体位置。在Internet上,每一个节点的都依靠唯一的IP地址互相区分和联系,而且这些节点在世界范围内是唯一的。IP地址由国际组织NIC(network information center)负责统一分配。IP地址包括两部分:网络ID和主机ID,用子网掩码进行区分。
6.可变长的子网掩码:
提出VLSM的原因是为了减小IP地址的浪费,让IP地址的计算和分配更为合理,它是在以划分的ABC类别上进行再次细化分。
7.无类域间的路由:
将数个IP网络结合在一起,使用一种无类别的路由选择算法,可以减少由Internet核心路由器的路由选择算法,减小路由器的路由记录数目。
8.网路硬件设备工作原理:
中继器、集线器、网桥、二层交换机、路由器和三层交换机
1).中继器:
中继器(RP repeater)是工作在物理层上的连接设备。适用于完全相同的两类网络的互连,主要功能是通过对数据信号的重新发送或者转发,来扩大网络传输的距离。 中继器是对信号进行再生和还原的网络设备:OSI模型的物理层设备。起放大信号的左右,解决线路太长,而引起的信号衰减问题。缺点:放大通信信号的同时会放大噪声。它处于OSI七层模型的物理层设备,无法读懂和修改OSI的上层数据,无法完成更多的选路和优化转发的特性,只有放大信号和延长线路的作用,端口少,不是一种密集型端口的网络设备,现在已被淘汰。
2).集线器:
集线器的英文称为“Hub”。“Hub”是“中心”的意思,集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理层”。集线器与网卡、网线等传输介质一样,属于局域网中的基础设备,采用CSMA/CD(即带冲突检测的载波监听多路访问技术)介质访问控制机制。集线器每个接口简单的收发比特,收到1就转发1,收到0就转发0,不进行碰撞检测。
3).网桥:
网桥(bridge)处于OSI模型的数据链路层(链路层设备不隔离广播),作用是减少集线器因共享和半双工特性引发的网络冲突问题。网桥的性能比集线器更好,因为网桥能够基于MAC地址进行数据链路层选路,能够基于学习构造MAC地址表,对MAC地址进行控制与过滤,所以网桥可以基于MAC地址进行选路,比集线器性能更好,将冲突域划分的更小,转发行能比集线器更高。但同样是不能隔离广播,所以不能让网桥形成闭合的环路。
9.网桥MAC地址自学习:
在网桥的接口上记录数据报文的源MAC地址,来完成整个MAC地址表的构建。
二、OSI开放式七层模型:
模型优点:
建立七层模型的主要目的是为解决异种网络互连时所遇到的兼容性问题。它的最大优点是将服务、接口和协议这三个概念明确地区分开来:服务说明某一层为上一层提供一些什么功能,接口说明上一层如何使用下层的服务,而协议涉及如何实现本层的服务;这样各层之间具有很强的独立性,互连网络中各实体采用什么样的协议是没有限制的,只要向上提供相同的服务并且不改变相邻层的接口就可以了。网络七层的划分也是为了使网络的不同功能模块(不同层次)分担起不同的职责,从而带来好处。
通信特点:对等通信
对等通信,为了使数据分组从源传送到目的地,源端OSI模型的每一层都必须与目的端的对等层进行通信,这种通信方式称为对等层通信。在每一层通信过程中,使用本层自己协议进行通信。
1.物理层:
O S I 模型的最低层或第一层,该层包括物理连网媒介,定义了网络线缆的一些电气特性。用户要传递信息就要利用一些物理媒体,如双绞线、同轴电缆等,但具体的物理媒体并不在OSI的7层之内,有人把物理媒体当做第0层,物理层的任务就是为它的上一层提供一个物理连接,以及它们的机械、电气、功能和过程特性,物理层的协议产生并检测电压以便发送和接收携带数据的信号。物理层将数字信号转换为比特流进行传输。在你的桌面P C 上插入网络接口卡,你就建立了计算机连网的基础。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率。
2.数据链路层:
OSI模型的第二层,它控制网络层与物理层之间的通信。它的主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的物理地址以及检错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。如果在传送数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。数据链路层在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。CSMA/CD、二层交换技术、网桥和MAC地址都在这层工作。
3.网络层:
OSI模型的第三层,其主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点A 到另一个网络中节点B 的最佳路径。由于网络层处理,并智能指导数据传送,路由器连接网络各段,所以路由器属于网络层。网络层负责在源机器和目标机器之间建立它们所使用的路由。这一层本身没有任何错误检测和修正机制,因此,网络层必须依赖于端端之间的由DLL提供的可靠传输服务。IP地址、NAT技术工作在这层,路由和三层交换机等设备也都工作在网络层。
4.传输层:
OSI模型中最重要的一层,提供端到端的数据交换机制。传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。除此之外,传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组。该过程即被称为排序。工作在传输层的一种服务是 T C P / I P 协议套中的T C P (传输控制协议),另一项传输层服务是I P X / S P X 协议集的SP X (序列包交换)。
5.会话层:
负责在网络中的两节点之间建立、维持和终止通信。 会话层的功能包括:建立通信链接,保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送。从技术层面上将,这个过程通信系统透明完成,用户看不到,可操作空间很小。
6.表示层:
应用程序和网络之间的翻译官,在表示层,数据将按照网络能理解的方案进行格式化;这种格式化也因所使用网络的类型不同而不同。为不同通信系统定制一种相互能理解的通信语言彼标准,使得不同的表达方式的系统之间可以成功进行通信,除此之外,表示层协议还对图片和文件格式信息进行解码和编码。这个过程通信系统透明完成,用户看不到,可操作空间很小。
7.应用层:
应用层也称为应用实体(AE),它由若干个特定应用服务元素(SASE)和一个或多个公用应用服务元素(CASE)组成。每个SASE提供特定的应用服务,例如文件运输访问和管理(FTAM)、电子文电处理(MHS)、虚拟终端协议(VAP)等。CASE提供一组公用的应用服务,例如联系控制服务元素(ACSE)、可靠运输服务元素(RTSE)和远程操作服务元素(ROSE)等。主要负责对软件提供接口以使程序能使用网络服务。术语“应用层”并不是指运行在网络上的某个特别应用程序 ,应用层提供的服务包括文件传输、文件管理以及电子邮件的信息处理。
三、OSI七层模型与TCP/IP四层、五层模型:
四、自底向上的网络分层(以五层协议解释):
1.物理层:
电脑要组网,第一件事要干什么?当然是先把电脑连起来,可以用光缆、电缆、双绞线、无线电波(WiFi)等方
式。物理层的作用就是通过物理手段把电脑连接起来,它主要规定了网络的一些电气特性,作用是负责传送0和1的电
信号。
通过物理手段将设备连接起来组网,物理手段就是光缆、电缆、双绞线、无线电波(WiFi)等,比如中美之间
的网络通信是通过海底光缆。
所以互联网可以说就是用物理设备将各个“局域网”相连组成的更大的“局域网“,更大局域网层层相连,最终就组
成了”互联网“。
2.数据链路层:
1).定义:
物理层就是传输电路的0和1信号的,但是单纯的0和1没有意义,必须规定解读方式:多少个0和1算一组?每个信号有什么意义?——这就是链路层的意义,它在物理层的上方,确定了0和1的分组方式。
2).以太网协议:
早些时候,各个公司都有自己的电信号分组方式,后来出现了“以太网”这种协议逐渐占据了主导的地位。“以太网”规定,一组电信号构成一个数据包,叫做“帧(Frame)”;每一帧分成两个个部分:标头(Head)和数据(Data)。
因此,数据链路层链路层的数据包就叫“以太网数据包”,他由“标头”和“数据”两部分组成——其中,“标头”包含数据包的一些说明项,比如发送者、接受者、数据类型等等。
3).MAC地址:
上面我们提到,以太网数据包的“标头”包含了发送者和接受者的信息,那么,发送者和接受者是如何标识的呢?
- 以太网规定,连入网络的所有设备,都必须具有“网卡”接口。数据包必须是从一块网卡,传送到另一块网卡,网卡的地址,就是数据包的发送地址和接受地址,也叫MAC地址。
- 每块网卡出厂的时候,都有全世界独一无二的MAC地址,长度是48位的二进制,通常用12个十六进制数表示。
- 前6个十六进制是厂商编号,后6个是该厂商的网卡流水号,有了MAC地址,就可以定位网卡和数据包的路径了。
4).广播:
定义地址只是第一步,后面还有更多步骤——首先,一块网卡怎么只带另一块网卡的MAC地址?回答是有一种ARP协议,可以解决这个问题。这个留到后面介绍,这里只需要知道,以太网数据包必须知道接收方的MAC地址,然后才能发送。
MAC地址,系统怎样才能把数据包准确送到接收方?回答是以太网采用了一种很"原始"的广播式的方式,它不是把数据包准确送到接收方,而是向本网络(局域网)内所有计算机发送,让每台计算机自己判断,是否为接收方。
一台计算机向本局域网内的所有电脑均发送相同的数据包,其他计算机收到这个数据包之后,会读取这个数据包的“标头”,找到其中接收方(目标方)的MAC地址,然后与自身的MAC地址进行比对,如果两者相同,说明就是要发给自己的,然后接受这个包并做出进一步的处理,否则丢弃这个包。这种发送方式就叫“广播”,主要通过分组交换机或者网络交换机进行。
3.网络层:
根据上面的讲解,理论上依靠MAC地址和广播技术,上海的网卡发出的数据包就可以找到洛杉矶网卡了——但是如果全世界的计算机都这么干,那么每一台计算机发出的数据包都同步广播到全世界其他电脑,再一一比对判断,这样显然是低效、不现实的。
因此,上面我们强调,广播是在发送者所在的局域网内广播的,不同也就是说,如果两台计算机没有在同一个子网(局域网)内,是无法通过广播直接传过去的。前面我们说过,互联网是由一个个子网组成的更大的子网,一级一级组网,最终构成的互联网。
因此我们必须找到一种方法,区分哪些MAC地址属于同一个子网。如果是同一个子网就采用广播的形式,如果不是,则采用“路由”的方式(后面会讲)发送——这就导致了网络层的出现,他的作用是引入一套新的地址,使我们能够区分哪些计算机属于同一个子网,这个套机制就叫做“网络地址”,也就是“IP地址”。
1).IP协议:
规定网络地址的协议,叫IP协议。他定义的地址,就叫做“IP地址”。IP地址目前有IPV4(Internet Protocol version 4,IPv4)和IPV6(Internet Protocol version 4,IPv6)两版,又称“互联网通信协议第四/六版”。2011年,IANA IPv4 pool地址完全用尽时,IPv6仍处在部署的初期,因此IPV4地址也是目前最为广泛的IP地址——这个版本规定,网络地址由32个二进制位组成,习惯上,我们分成四段十进制数表示IPV4地址,也称为点分十进制,从0.0.0.0到255.255.255.255。
互联网上的每一台计算机,都会被分配到一个IP地址,这个地址由两部分组成,前一部分代表网络,后一部分代表主机(又称终端系统,end system)。比如,IP地址192.168.0.1,这是一个32位的地址,假定它的网络部分是前24位(192.168.0),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说192.168.0.2应该与192.168.0.1处在同一个子网络,而后面的“2”与“1”则是同一子网内两台不同电脑(主机)的编号。
IP地址分类
2).子网掩码:
问题在于单单从IP地址,我们无法判断网络部分。还是以192.168.0.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的。那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数"子网掩码"(subnet mask)。
所谓"子网掩码",就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。 比如,IP地址192.168.0.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道"子网掩码",我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
- 子网掩码(Subnet Mask)又叫网络掩码、地址掩码,必须结合IP地址一起对应使用。
- 只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。
- 子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。
- 子网掩码还用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而IP浪费。
3).VLSM子网划分:
Pv4地址如果只使用有类(A、B、C类)来划分,会造成大量的浪费或者不够用,为了解决这个问题,可以在有类网络的基础上,通过对IP地址的主机号进行再划分,把一部分划入网络号,就能划分各种类型大小的网络了。
为了解决IPv4的不足,提高网络划分的灵活性,诞生了两种非常重要的技术,那就是VLSM(可变长子网掩码)和CIDR(无类别域间路由),把传统标准的IPv4有类网络演变成一个更为高效,更为实用的无类网络。
通过VLSM实现子网划分的基本思想很简单:就是借用现有网段的主机位的最左边某几位作为子网位,划分出多个子网。子网划分又分为等长子网划分和变长子网划分。
- 把原来有类网络IPv4地址中的“网络ID”部分向“主机ID”部分借位
- 把一部分原来属于“主机ID”部分的位变成“网络ID”的一部分(通常称之为“子网ID”)。
- 原来的“网络ID”+“子网ID”=新“网络ID”。“子网ID”的长度决定了可以划分子网的数量。
子网划分的任务包括:
- 确定子网掩码的长度。
- 确定子网下的主机可用地址范围(第一个可用IP和最后一个可用IP)。
- 确定网络地址(主机位全为0)和广播地址(主机位全为1),不能分配计算机主机用。
子网划分实例:
- 等分为两个子网
将192.168.0.0 255.255.255.0这个网络等分成2个子网
分析:
该网络子网掩码为/24,要划分为2个子网,要借用主机位1位作为子网位。
因为二进制数0和1按一位排列组合,只有这2种,分别为:0,1,如下图所示。
0是A子网
1是B子网
借用主机1位,所以子网掩码+1位,由原来的255.255.255.0 (/24)变为255.255.255.128(/25)
4).路由:
上面我们已经确定了两台计算机是否遭同一个子网中,如果在,则采用广播+MAC寻址的的方式发送数据包,如果不是,则要采用“路由”的方式了,那么什么是“路由”呢?
路由就是通过互联的网络把信息从源地址传输到目的地址的活动。路由引导分组转送,经过一些中间的节点后,到它们最后的目的地。
从“路由”的定义中可以看到,“路由”是一种活动,一种动作,一种行为,作用是是将信息从原地址传输到目的地址,比较特殊的是,原地址和目标地址是在两个不同的子网中的。 那么如何传输呢?路由定义一条路径,经过因特网发送包到另一网络上的地址,但路由不定义完全路径,只定义从主机到可以将包转发到目的地的网关(子网)间的路径段(或从一个子网到另一个子网)。
1.动态路由/静态路由:
- 动态路由: 路由选择器自动共享路由信息,自动构造路由表,需要一个路由协议,如RIP或OSPF
- 静态路由: 路由选择器不共享路由信息(单方向路由),手工构造路由表
2.直连路由/网关路由(间接路由):
其区别在于,发往直连路由的设备中不但具有指明目的端的I P地址,还具有其mac地址。当报文被发往一个间接路由时,I P地址指明的是最终的目的地,但是mac地址指明的是网关(即下一跳路由器)。
3.主机路由/网络路由:
直连路由和网关路由是由下一跳区分的,而主机路由和网络路由是由目的地址的完整度区分的
4.默认路由(缺省路由):
(Default route),是对IP数据包中的目的地址找不到存在的其他路由时,路由器所选择的路由。目的地不在路由器的路由表里的所有数据包都会使用默认路由。这条路由一般会连去另一个路由器,而这个路由器也同样处理数据包; 如果知道应该怎么路由这个数据包,则数据包会被转发到已知的路由;否则,数据包会被转发到默认路由,从而到达另一个路由器。每次转发,路由都增加了一跳的距离。
到达了一个知道如何到达目的地址的路由器时,这个路由器就会根据最长前缀匹配来选择有效的路由。子网掩码匹配目的IP地址而且又最长的网络会被选择。用无类别域间路由标记表示的IPv4默认路由是0.0.0.0/0。因为子网掩码是/0,所以它是最短的可能匹配。 当查找不到匹配的路由时,自然而然就会转而使用这条路由。
5).路由器:
简单理解就是实现路由功能的机器。路由器连接两个或多个网络并提供路由功能。
6).网关:
是路由器的一种,通常我们把网络层使用的路由器称为网关,路由器可以在网络接口级或物理级路由;网关是在网络层上路由(个人感觉应该是一种概念,即在网络层连节两个子网的概念,并不存在实体,真正实现路由功能还是得靠路由器)。
MAC地址和MAC地址对应的IP,而网关由于是网络层的概念因此只有IP地址。在今天很多局域网采用都是路由来接入网络,因此现在通常指的网关就是路由器的IP。
另外,需要强调一点,虽然路由器上面有MAC地址和IP地址,但它并不能通过MAC地址工作,必须通过IP寻址。因此它是工作在网络层的设备。
7).网络交换机:
是一个扩大网络的器材,能为子网中提供更多的连接端口,以便连接更多的电脑。交换机与路由器的区别:
- 工作层次不同 交换机主要工作在数据链路层(第二层) 路由器工作在网络层(第三层)。
- 转发依据不同 交换机转发所依据的对象是:MAC地址。(物理地址) 路由转发所依据的对象是:IP地址。(网络地址)
- 主要功能不同 交换机主要用于组建局域网,连接同属于一个(广播域)子网的所有设备,负责子网内部通信(广播)。 路由主要功能是将由交换机组好的局域网相互连接起来,或者将他们接入Internet。 交换机能做的,路由都能做。 交换机不能分割广播域(子网),路由可以。 路由还可以提供防火墙的功能。 路由配置比交换机复杂。
8).ARP协议:
在上面的过程中,我们实际上假设了,每一台主机和路由都能了解局域网内的IP地址和MAC地址的对应关系,这是实现IP包封装(encapsulation)到帧的基本条件。IP地址与MAC地址的对应是通过ARP协议传播到局域网的每个主机和路由。每一台主机或路由中都有一个ARP cache,用以存储局域网内IP地址和MAC地址如何对应。
ARP协议(ARP介于数据链路层和网络层之间,ARP包需要包裹在一个帧中)的工作方式如下:主机发出一个ARP包,该ARP包中包含有自己的IP地址和MAC地址。通过ARP包,主机以广播的形式询问局域网上所有的主机和路由:我是IP地址xxxx,我的MAC地址是xxxx,有人知道199.165.146.4的MAC地址吗?拥有该IP地址的主机会回复发出请求的主机:哦,我知道,这个IP地址属于我的一个NIC(网卡),它的MAC地址是xxxxxx。由于发送ARP请求的主机采取的是广播形式,并附带有自己的IP地址和MAC地址,其他的主机和路由会同时检查自己的ARPcache,如果不符合,则更新自己的ARP cache。
这样,经过几次ARP请求之后,ARP cache会达到稳定。如果局域网上设备发生变动,ARP重复上面过程。ARP协议只用于IPv4。IPv6使用Neighbor Discovery Protocol来替代ARP的功能。
4.传输层:
1).端口号:
有了MAC地址和IP地址,我们已经可以在互联网上的任意两台电脑之间建立通信了。接下来的问题是,同一台主机上许多程序(进程)都需要用到网络,比如你一遍浏览网页一遍聊天。当一个数据包从网上发送过来的时候,我们需要一个参数来区分,他到底是提供哪个进程使用的——这个参数就叫做“端口号”,他其实就是每一个使用网卡的程序的编号。 每个数据包发送到主机特定的端口,所以不同的程序就能取到自己想要的数据包。
端口是0到65535之间的一个整数,正好16个二进制。0~1023的端口被系统占用,用户只能使用大于1023的端口。不管是浏览网页还是聊天,应用程序都会随机选用一个端口,然后与服务器简历相应的端口关系。这里需要补充一点,HTTP协议默认使用80端口,8080是用来访问代理服务的。
“传输层”的功能,就是建立“端口到端口”之间的通信。相比之下,“网络层”的功能是建立“主机到主机"的通信。只要确定主机和端口号,我们就能实现程序之间的交流。
2).Socket:
上面我们已经说了,传输层是建立“端口到端口”之间的通信,更具体一点,也就是程序和程序之间的通信,或者进程间通信。嗯,挺唬人的一个概念。
进程间通信分为两种——一种是主机内部(或终端内部)进程间通信,这个由终端或主机上的操作系统决定,比如在Android系统上面进程间通信就是AIDL;另一种是跨主机进程间通信或者网络进程间通信,也叫“socket通 信”。我们可以先笼统的理解——Unix系统把主机+端口,叫做"套接字"(socket),当然,这样说是有失偏颇的。
那么,Socket是什么?
- 从编程语言的角度,socket是一个无符号整型变量,用来标识一个通信进程。 两个进程通信,总要知道这几个信息:双方的ip地址和端口号,通信所采用的协议栈。socket就是和这些东西绑定的,实现socket可以使用unix提供的接口,也可以使用wIndows提供的winSock。
- socket本质是编程接口(API),对TCP/IP的封装。TCP/IP只是一个协议栈,必须要具体实现,同时还要提供对外的操作接口(API),这就是Socket接口。 通过Socket,我们才能使用TCP/IP协议,因此有了一系列我们知道的函数接口——connect、accept、send、read、write等。
3).UDP/TCP协议:
UDP和TCP协议都是传输层的协议,他们的主要作用就是在应用层的数据包标头加上端口号(或者在IP协议的数据包中插入端口号)。
- UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。
- TCP协议可以近似认为是有确认机制的UDP协议。每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
TCP协议的报文格式:
- 16位源端口号和16位目的端口号。
- 32位序号:一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。
- 32位确认号:用来响应TCP报文段,给收到的TCP报文段的序号加1,三握时还要携带自己的序号。
- 4位头部长度:标识该TCP头部有多少个4字节,共表示最长15*4=60字节。同IP头部。
- 6位保留。6位标志。URG(紧急指针是否有效)ACK(表示确认号是否有效)PSH(提示接收端应用程序应该立即从TCP接收缓冲区读走数据)RST(表示要求对方重新建立连接)SYN(表示请求建立一个连接)FIN(表示通知对方本端要关闭连接)。
- 16位窗口大小:TCP流量控制的一个手段,用来告诉对端TCP缓冲区还能容纳多少字节。
- 16位校验和:由发送端填充,接收端对报文段执行CRC算法以检验TCP报文段在传输中是否损坏。
- 16位紧急指针:一个正的偏移量,它和序号段的值相加表示最后一个紧急数据的下一字节的序号。
4).TCP三次握手与四次挥手:
- 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
- 确认号ack: 占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
- 确认ACK: 占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
- 同步SYN: 连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
- 终止FIN: 用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接。ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
字段 含义 URG 紧急指针是否有效。为1,表示某一位需要被优先处理 ACK 确认号是否有效,一般置为1。 PSH 提示接收端应用程序立即从TCP缓冲区把数据读走。 RST 对方要求重新建立连接,复位。 SYN 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 FIN 希望断开连接
三次握手过程:
所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
- 第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers).
- 第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
SYN攻击:
SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击 netstat -n -p TCP | grep SYN_RECV,一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.但是不能完全防范syn攻击。
四次挥手过程:
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些
5.应用层:
应用程序收到"传输层"的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。"应用层"的作用,就是规定应用程序的数据格式。 举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层"。这是最高的一层,直接面对用户。
这里的引用层是文章开头的OSI七层模型的最上面三层的综合,因为是直接面向用户,因此它的主要作用是“消除设备固有数据格式和网络标准数据格式直接的差异”,因为在网络流中,数据的格式是标准化的,但是具体到不同得设备,不同的操作系统上,他的要求数据呈现格式是不同的,因此需要转化成统一的、用户能够感知的声音、图片、文字等信息,这就是应用层做的事情。