计算机网络理论笔记.docx
《计算机网络理论笔记.docx》由会员分享,可在线阅读,更多相关《计算机网络理论笔记.docx(48页珍藏版)》请在冰点文库上搜索。
计算机网络理论笔记
计算机网络(谢希仁第五版)
一、ISO和TCP/IP的层
以下是各层的核心功能(注意是核心功能,而不是基本功能,所以和许多书上的描述不一样)
L1,物理层。
负责相邻两个节点之间的比特流的传输,数据单元是比特。
L2,数据链路层。
在数据链路间正确的传输帧,数据单元是帧。
L3,网络层。
在端到端之间正确的传输分组,数据单元是分组(也叫作包packet)。
IP
L4,传输层。
在端到端之间正确的传输消息(也叫作报文)。
TCP,UDP
L5,会话层。
负责会话的进程管理。
L6,表示层。
负责数据的压缩/解压缩、加密/解密、不同系统之间数据格式的转换。
L7,应用层。
系统与用户之间的接口。
分层的原因:
下层是将功能封装起来通过一个统一的接口提供给上层使用的,这样上层就不用再因为下层的不同而分别考虑问题了,如数据链路层的帧传输就不用考虑不同物理层介质的比特率不同问题,网络层的包传输同样不会考虑链路层的帧结构不同问题。
上层是通过调用已封装好的下层功能进行功能的升华。
感觉就和编程中的接口思想类似。
TCP/IP协议并不完全符合OSI的七层参考模型。
传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。
该模型的目的是使各种硬件在相同的层次上相互通信。
这7层是:
物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。
而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
这4层分别为:
●应用层:
应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
●传输层:
在此层中,它提供了节点间的数据传送服务,为两个用户进程之间建立、管理和拆除可靠而又有效的端到端连接。
如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
●互连网络层:
负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),即规定了数据传输时的基本单元和格式,还定义了数据包的递交办法和路由选择。
如网际协议(IP)。
●网络接口层:
对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、SerialLine等)来传送数据。
定义了将数据组成正确帧的规程和在网络中传输帧的规程,帧是指一串数据,它是数据在网络中传输的单位。
●物理层:
对应于网络的基本硬件,这也是Internet物理构成,即我们可以看得见的硬设备,如PC机、互连网服务器、网络设备等,必须对这些硬设备的电气特性作一个规范,使这些设备都能够互相连接并兼容使用。
IP:
IP协议规定了数据传输时的基本单元和格式。
如果比作货物运输,IP协议规定了货物打包时的包装箱尺寸和包装的程序。
除了这些以外,IP协议还定义了数据包的递交办法和路由选择。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。
IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。
IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
TCP:
在IP协议中定义的传输是单向的,也就是说发出去的货物对方有没有收到我们是不知道的。
就好像8毛钱一份的平信一样。
那对于重要的信件我们要寄挂号信怎么办呢?
TCP协议就是帮我们寄“挂号信”的。
TCP协议提供了可靠的面向对象的数据流传输服务的规则和约定。
简单的说在TCP模式中,对方发一个数据包给你,你要发一个确认数据包给对方。
通过这种确认来提供可靠性。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。
TCP将包排序并进行错误检查,同时实现虚电路间的连接。
TCP数据包中包括序号(ISN)和确认(ack),所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。
应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
UDP:
UDP与TCP位于同一层,但对于数据包的顺序错误或重发。
因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。
相对于FTP或Telnet,这些服务需要交换的信息量较小。
欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。
IPv4最致命的两个缺陷在于:
∙地址只有32位,IP地址空间有限;
∙不支持服务等级(QualityofService,QoS)的想法,无法管理带宽和优先级,故而不能很好的支持现今越来越多的实时的语音和视频应用。
因此IPv6(128bits)浮出海面,用以取代IPv4。
二、网络层
1.IP头
structip
{
#if__BYTE_ORDER==__LITTLE_ENDIAN
unsignedintip_hl:
4;/*headerlength以4字节为单位*/
unsignedintip_v:
4;/*version*/
#endif
#if__BYTE_ORDER==__BIG_ENDIAN
unsignedintip_v:
4;/*version*/
unsignedintip_hl:
4;/*headerlength*/
#endif
u_int8_tip_tos;/*typeofservice*/
u_shortip_len;/*totallengthIP数据的长度,以字节为单位。
*/
u_shortip_id;/*identification*/
u_shortip_off;/*fragmentoffsetfield碎片偏移,这和上面ID一起用来重组碎片*/
#defineIP_RF0x8000/*reservedfragmentflag*/
#defineIP_DF0x4000/*dontfragmentflag*/
#defineIP_MF0x2000/*morefragmentsflag*/
#defineIP_OFFMASK0x1fff/*maskforfragmentingbits*/
u_int8_tip_ttl;/*timetolive每经过一个路由的时候减一,直到为0时被抛弃*/
u_int8_tip_p;/*protocol表示创建这个IP数据包的高层协议,如TCP,UDP协议*/
u_shortip_sum;/*checksum首部校验和,提供对首部数据的校验*/
structin_addrip_src,ip_dst;/*sourceanddestaddress发送者和接收者的IP地址*/
};
2.ICMP头
ICMP(InternetControlMessageProtocol)Internet控制报文协议,处于网络层。
它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
structicmphdr
{
u_int8_ttype;/*messagetype*/
u_int8_tcode;/*typesub-code*/
u_int16_tchecksum;
union
{
struct
{
u_int16_tid;
u_int16_tsequence;
}echo;/*echodatagram*/
u_int32_tgateway;/*gatewayaddress*/
struct
{
u_int16_t__unused;
u_int16_tmtu;
}frag;/*pathmtudiscovery*/
}un;
};
三、传输层
1.TCP和UDP的区别
1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务;
2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不
对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要
负责传输可靠性方面的所有工作;
3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;
4)UDP段结构比TCP的段结构简单,因此网络开销也小。
2.UDP头
structudphdr
{
u_int16_tsource;
u_int16_tdest;
u_int16_tlen;
u_int16_tcheck;
};
3.TCP头
structtcphdr
{
u_int16_tsource;/*发送TCP数据的源端口*/
u_int16_tdest;/*接受TCP数据的目的端口*/
u_int32_tseq;/*标识该TCP所包含的数据字节的开始序列号*/
u_int32_tack_seq;/*确认序列号,表示接受方下一次接受的数据序列号*/
#if__BYTE_ORDER==__LITTLE_ENDIAN
u_int16_tres1:
4;
u_int16_tdoff:
4;
u_int16_tfin:
1;
u_int16_tsyn:
1;
u_int16_trst:
1;
u_int16_tpsh:
1;
u_int16_tack:
1;
u_int16_turg:
1;
u_int16_tres2:
2;
#elif__BYTE_ORDER==__BIG_ENDIAN
u_int16_tdoff:
4;/*数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5*/
u_int16_tres1:
4;/**/
u_int16_tres2:
2;/**/
u_int16_turg:
1;/*如果设置紧急数据指针,则该位为1*/
u_int16_tack:
1;/*如果确认号正确,那么为1*/
u_int16_tpsh:
1;/*如果设置为1,那么接收方收到数据后,立即交给上一层程序*/
u_int16_trst:
1;/*为1的时候,表示请求重新连接*/
u_int16_tsyn:
1;/*为1的时候,表示请求建立连接*/
u_int16_tfin:
1;/*为1的时候,表示亲戚关闭连接*/
#endif
u_int16_twindow;/*窗口,告诉接收者可以接收的大小*/
u_int16_tcheck;/*对TCP数据进行较核*/
u_int16_turg_prt;/*如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值*/
};
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
●第一次握手:
建立连接时,客户端发送syn包(syn=j,即初始化序列号(ISN))到服务器,并进入SYN_SEND状态,等待服务器确认;
●第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
●第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
其中第二步就是SYN-ACK(SYN_RCVD),也就是你可以用netstat命令看到的。
一般来说,在第二步的时候,服务器会分配内存,给客户机响应,等待客户机回答,如果收到回答,即完成第三步,那就建立连接(ESTABLISHED);如果客户机在第二步的时候网断了,服务器会一直等待直到timeout。
这也可能引起安全问题,著名的DDoS攻击就是利用TCP这个固有的漏洞,即如果很多客户机只启动第一步,那这样服务器会很快耗尽内存而宕机。
你可以用netstat观察连接,如果SYN_RCVD状态很多的话,你可能受到攻击了。
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:
●未连接队列:
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。
这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
●Backlog参数:
表示未连接队列的最大容纳数目。
●SYN-ACK重传次数:
服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
注意,每次重传等待的时间不一定相同。
●半连接存活时间:
是指半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。
有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
4.TCP/IP三次握手的过程和抓包分析原理深入分析
简述TCP三次握手过程,并说明为什么要3次握手?
TCP连接是通过三次握手进行初始化的。
三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。
以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程:
1.客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。
2.服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。
3.客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1和序号x+1的ACK报文,一个标准的TCP连接完成。
TCP使用类似的握手过程来结束连接。
这可确保两个主机均能完成传输并确保所有的数据均得以接收。
TCPClientFlagsTCPServer
1SendSYN(seq=x)----SYN--->SYNReceived
2SYN/ACKReceivedACKReceived,ConnectionEstablished
握手阶段:
序号 方向 seqack
1 A->B100000
2B->A2000010000+1=10001
3A->B1000120000+1=20001
解释:
1:
A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0
2:
B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:
你的请求我已收到,我这方的数据流就从这个数开始。
B的ACK是A的seq加1,即10000+1=10001
3:
A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:
你的回复我收到了,我这方的数据流就从这个数开始。
A此时的ACK是B的seq加1,即20000+1=20001
数据传输阶段:
序号
方向
seq
ack
size
23
A->B
40000
70000
1514
24
B->A
70000
40000+1514-54=41460
54
25
A->B
41460
70000+54-54=70000
1514
26
B->A
70000
41460+1514-54=42920
54
解释:
23:
B接收到A发来的seq=40000,ack=30000,size=1514的数据包
24:
于是B向A也发一个数据包,告诉B,你的上个包我收到了。
B的seq就以它收到的数据包的ACK
填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以
证实B发过来的数据全收到了。
25:
A在收到B发过来的seq为41460的数据包时,一看到41460,正好是它的上个数据包的seq加
上包的大小,就明白,上次发送的数据包已安全到达。
于是它再发一个数据包给B。
这个正在发送的
数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的
size(54)填充,即ack=70000+54-54(全是头长,没数据项)。
26:
一样的啊
四、应用层
1.DHCP协议
DHCP是DynamicHostConfigurationProtocol的缩写,前身是BOOTP。
BOOTP原本是用于无磁碟主机连接的网络上面的,网络主机使用BOOTROM而不是磁碟起动并连接上网络,BOOTP则可以自动地为那些主机设定TCP/IP环境。
但BOOTP有一个缺点:
您在设定前须事先获得客户端的硬体地址,而且,与IP的对应是静态的。
换而言之,BOOTP非常缺乏"动态性",若在有限的IP资源环境中,BOOTP的一对一对应会造成非常可观的浪费。
DHCP可以说是BOOTP的增强版本,它分为两个部份﹕一个是服务器端,而另一个是客户端。
所有的IP网络设定资料都由DHCP服务器集中管理,并负责处理客户端的DHCP要求;而客户端则会使用从服务器分配下来的IP环境资料。
比较起BOOTP,DHCP透过"租约"的概念,有效且动态的分配客户端的TCP/IP设定,而且,作为兼容考量,DHCP也完全照顾了BOOTPClient的需求。
DHCP的分配形式
首先,必须至少有一台DHCP服务器工作在网络上面,它会监听网络的DHCP请求,并与客户端搓商TCP/IP的设定环境。
它提供两种IP定位方式﹕
(1)AutomaticAllocation
自动分配,其情形是﹕一旦DHCP客户端第一次成功的从DHCP服务器端租用到IP地址之后,就永远使用这个地址。
(2)DynamicAllocation
动态分配,当DHCP第一次从HDCP服务器端租用到IP地址之后,并非永久的使用该地址,只要租约到期,客户端就得释放(release)这个IP地址,以给其它工作站使用。
当然,客户端可以比其它主机更优先的延续(renew)租约,或是租用其它的IP地址。
动态分配显然比自动分配更加灵活,尤其是当您的实际IP地址不足的时候,例如﹕您是一家ISP,只能提供200个IP地址用来给拨接客户,但并不意味着您的客户最多只能有200个。
因为要知道,您的客户们不可能全部同一时间上网的,除了他们各自的行为习惯的不同,也有可能是电话线路的限制。
这样,您就可以将这200个地址,轮流的租用给拨接上来的客户使用了。
这也是为什么当您查看IP地址的时候,会因每次拨接而不同的原因了(除非您申请的是一个固定IP,通常的ISP都可以满足这样的要求,这或许要另外收费)。
当然,ISP不一定使用DHCP来分配地址,但这个概念和使用IPPool的原理是一样的。
DHCP除了能动态的设定IP地址之外,还可以将一些IP保留下来给一些特殊用途的机器使用,它可以按照硬体地址来固定的分配IP地址,这样可以给您更大的设计空间。
同时,DHCP还可以帮客户端指定router﹑netmask﹑DNSServer﹑WINSServer﹑等等项目,您在客户端上面,除了将DHCP选项打勾之外,几乎无需做任何的IP环境设定。
DHCP的工作原理
视乎客户端是否第一次登录网络,DHCP的工作形式会有所不同。
(1)第一次登录的时候
1.寻找Server。
当DHCP客户端第一次登录网络的时候,也就是客户发现本机上没有任何IP资料设定,它会向网络发出一个DHCPDISCOVER封包。
因为客户端还不知道自己属于哪一个网络,所以封包的来源地址会为0.0.0.0,而目的地址则为255.255.255.255,然后再附上DHCPDISCOVER的信息,向网络进行广播。
在Windows的预设情形下,DHCPDISCOVER的等待时间预设为1秒,也就是当客户端将第一个DHCPDISCOVER封包送出去之后,在1秒之内没有得到回应的话,就会进行第二次DHCPDISCOVER广播。
若一直得不到回应的情况下,客户端一共会有四次DHCPDISCOVER广播(包括第一次在内),除了第一次会等待1秒之外,其余三次的等待时间分别是9﹑13﹑16秒。
如果都没有得到DHCP服务器的回应,客户端则会显示错误信息,宣告DHCPDISCOVER的失败。
之后,基于使用者的选择,系统会继续在5分钟之后再重复一次DHCPDISCOVER的过程。
2.提供IP租用地址。
当DHCP服务器监听到客户端发出的DHCPDISCOVER广播后,它会从那些还没有租出的地址范围内,选择最前面的的空置IP,连同其它TCP/IP设定,回应给客户端一个DHCPOFFER封包。
由于客户端在开始的时候还没有IP地址,所以在其DHCPDISCOVER封包内会带有其MAC地址信息,并且有一个XID编号来辨别该封包,DHCP服务器回应的DHCPOFFER封包则会根据这些资料传递给要求租约的客户。
根据服务器端的设定,DHCPOFFER封包会包含一个租约期限的信息。
3.接受IP租约。
如果客户端收到网络上多台DHCP服务器的回应,只会挑选其中一个DHCPOFFER而已(通常是最先抵达的那个),并且会向网络发送一个DHCPREQUEST广播封包,告诉所有DHCP服务器它将指定接受哪一台服务器提供的IP地址。
同时,客户端还会向网络发送一个ARP封包,查询网络上面有没有其它机器使用该IP地址;如果发现该IP已经被占用,客户端则会送出一个DHCPDECLINE封包给DHCP服务器,拒绝接受其DHCPOFFER,并重新发送DHCP