1、TCP/IP模型
TCP/IP协议通信的过程其实就是数据入栈出栈的过程。入栈就是数据发送方每层不断的封装首部和尾部,添加一些传输的信息,保证能传输到目的地、出站就是数据接收方每层不断的拆除首部和尾部,得到最终的传输数据。
下图是以http协议来说明:
二、数据链路层
物理层负责的是0、1比特流与物理设备电压高低、光的闪灭之间的互换。
数据链路层负责的就是将这些0、1序列划分为数据帧,然后从一个节点(主机)传输到另一个节点(主机)。这些节点是通过MAC来唯一标识的(MAC,物理地址,一个主机有一个MAC地址)。
封装成帧:把网络层数据报加头和尾,封装成帧,帧头包括了源MAC地址和目的MAC地址;
透明传输:0比特填充、转义字符;
可靠传输:在出错率很低的链路上很少用(因为一根线连着彼此,当然不会出错),在无线链路WLAN会保证可靠传输;
差错检测(CRC):接受者检测错误,如果发现错误,就丢弃该帧;
三、网络层
1、IP协议
IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。
要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制,这被认为是上层协议:TCP或UDP要做的事情。
1.1 IP地址
数据链路层中通过MAC地址来识别两个不同的节点,在IP层(网络层)通过IP地址来识别。
32位IP地址分为网络位和地址位,这样可以减少路由器中路由表记录的数目,有了网络地址,就可以限定拥有相同网络地址的终端都在一个范围内,那么路由表就只需要维护一条这个网络地址的方向,就可以找到相应的这些终端了。
A类地址:0.0.0.0~126.255.255.255,子网掩码:255.0.0.0(可以通过子网划分,改变子网掩码)。A类地址分配给规模特别大的网络使用。
- 127表示的是回环测试相应的地址,所以实际范围是1-126,。
- 回送地址:127.0.0.1。 也是本机地址,等效于localhost或本机IP。一般用于测试使用。例如:ping 127.0.0.1来测试本机TCP/IP是否正常。
- 私有地址范围:10.0.0.0~10.255.255.255
B类地址:128.0.0.0~191.255.255.255,默认子网掩码为:255.255.0.0。B类地址分配给一般的中型网络。
- 私有地址范围:172.16.0.0~172.31.255.255
C类地址:192.0.0.0~223.255.255.255,默认网络掩码为:255.255.255.0。C类地址分配给小型网络,如一般的局域网和校园网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。
- 私有地址范围:192.168.0.0~192.168.255.255
D类地址(广播地址):224.0.0.0到239.255.255.255。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
E类地址保留给将来使用:240.0.0.0到255.255.255.254。
全0和全1都不能用:
- 全零(“0.0.0.0”)地址对应于当前主机,表示该地址是本地宿主机,不能传送。
- 全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。
1.2 子网
在主机号中拿一部分作为子网号,进而把两级IP地址划分为三级IP地址。
IP地址:{< 网络号 >, < 子网号 >, < 主机号 >}
1.2.1 子网作用
子网掩码是一个应用于TCPIP网络的32位二进制值,必须结合IP地址使用。
子网掩码与32位于IP地址32位对应,方法就是如果某位是网络地址,那么子网掩码就是1,否则就是0.
子网掩码可以通过与IP地址相与计算,分理处IP地址的网络地址和主机地址,用于判断IP地址是在局域网上还是广域网上。
子网掩码一般用于将网络进一步划分为若干子网,避免主机过多而拥堵或过少而IP浪费。
1.2.2 为什么要用子网掩码
可以分离出IP地址的网络位和主机位。为什么要分离?因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接收方在本网络,那么就可以把数据报直接发送到目标主机,否则就需要通过路由网关将数据报转发送到目的地。
1.2.3 子网掩码的分类
(1)缺省子网掩码(未划分子网)
子网掩码32位与IP地址32位对应,如果某位是网络地址,则子网掩码为1,否则为0。
A类网络缺省子网掩码:255.0.0.0
B类网络缺省子网掩码:255.255.0.0
C类网络缺省子网掩码:255.255.255.0
(2)自定义子网掩码(用于划分子网)
将一个网络划分为若干个子网,每个子网拥有不同的网络地址或子网地址。因为IP是有限的,实际上我们是将主机地址分为了两个部分:子网网络地址、子网主机地址。
未做子网划分的ip地址:网络地址 + 主机地址
做子网划分的IP地址:网络地址 + (子网网络地址 + 子网主机地址)
1.2.4 子网掩码与IP地址的关系
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。具体就是两台计算机的IP地址与子网掩码进行与计算,得到的结果相同则说明是处于同一个子网络的,可以进行直接的通讯。
IP地址与子网掩码相与,得到网络位;将子网掩码取反后再和IP地址相与,得到主机位。
1.2.5 为什么要划分子网
比如A类地址中,每个A类网络可能有很多台主机,他们处于一个广播域内。在同一个广播域内有这么多主机是不可能的,网络会因为广播通信而饱和。另一方面,IP地址资源越来越少,为实现更小的广播域,就需要进一步划分成更小的网络。划分子网后,通过使用掩码,将子网隐藏起来,使得从外部看网络没有变化,这就是子网掩码。
1.2.6 子网划分
子网划分就是借用几个主机位来充当子网的网络地址,从而将原网络划分成若干子网。
划分子网时,随着借用主机位数增多,子网数目也增多,但每个子网中可用的主机数就逐渐减少。
如C类地址,原有8位主机位,而且全0和全1不能用,所以一共有2^8-2即254个主机地址,默认子网掩码是255.255.255.0。
借用一位主机位,产生2^1-2=0个子网,每个子网有2^7个主机地址;
借用2位主机位,产生2^2-1=2个子网,每个子网有2^6个主机位;
......
1.2.7 子网掩码的计算
1、利用子网数来计算
在求子网掩码之前必须先搞清楚要划分的子网数目,以及每个子网内的所需主机数目。
- 将子网数目转化为二进制来表示
- 取得该二进制的位数,为 N
- 取得该 IP地址的类子网掩码,将其主机地址部分的的前N位置 1 即得出该IP地址划分子网的子网掩码。
如欲将C类IP地址192.168.10.0划分成4个子网:
- 4=100
- 该二进制为三位数,N = 3
- 将C类地址的子网掩码255.255.255.0的主机地址前3位置 1,得到子网掩码255.255.255.224。
2、利用主机数来计算
- 将主机数目转化为二进制来表示
- 如果主机数小于或等于254(注意去掉保留的两个IP地址),则取得该主机的二进制位数。
- 将该类IP地址的主机地址位数全部置1,然后从后向前的将N位全部置为 0,即为子网掩码值。
如欲将B类IP地址192.168.10.0划分成若干子网,每个子网内有主机25台:
1) 25=11001
2)该二进制为十位数,N = 5
3)将该B类地址的子网掩码 255.255.255.0的主机地址全部置 1,得到255.255.255.255,然后再从后向前将后5位置0,即为:11111111.11111111.11111111.11100000,即255.255.252.224。
1.3 IP协议头
八位的TTL( Time To Live)字段。这个字段规定该数据包在穿过多少个路由之后才会被抛弃。某个IP数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。
这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64。
2、ARP和RARP协议
ARP (地址解析协议,Address Resolution Protocol)是根据IP地址获取MAC地址的一种协议。
主机本来不知道这个IP对应的是哪个主机的哪个端口,当主机要送一个IP包的时候,会先查一下自己的ARP高速缓存(就是一个IP-MAC地址对应表缓存)。如果查到的IP-MAC值对不存在,那么主机向网络发送一个ARP协议广播包,这个包里面就有要查询的IP地址,接收到这份广播包的所有地址都会查询自己的IP地址,只有相同IP地址的接收到广播请求的主机或路由器,发回一个ARP应答分组,应答中包含它的IP地址和物理地址,并保存在发送ARP广播的主机的ARP缓存中。其他主机或路由器都丢弃此分组。
广播主机拿到ARP包后会更新自己的ARP缓存。发送广播的主机就会用新的ARP缓存数据准备好数据链路层的数据包发送工作。
RARP协议的工作与此相反
3、ICMP协议(Internet Control Message Protocol,网络控制报文协议)
IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。
ICMP不是高层协议,而是IP层的协议。
当传送IP数据包发生错误。比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。
四、ping
ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分。
利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。
例如:当我们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。
ping这个单词源自声纳定位,而这个程序的作用也确实如此,它利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。
ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。我们可以看到, ping给出来了传送的时间和TTL的数据。
五、Traceroute
Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。
原理就是它收到目的主机的IP地址之后,首先给IP地址发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变成0后,路由器就把这个包给丢弃了,同时产生一个主机不可达的ICMP数据报给主机。主机收到这个数据包以后,再发一个TTL=2的UDP数据报给目的主机,然后第二个路由器就又会返回一个ICMP数据报,如此往复,知道到达目的主机,这样traceroute就拿到了所有路由器的IP。
六、TCP/UDP
TCP/UDP都是是传输层协议,但是两者具有不同的特性,同时也具有不同的应用场景。
面向报文的传输方式就是应用层交给UDP多长的报文,UDP就照样发送,也就是一次就发送一个报文。因此应用程序需要选择合适大小的报文,如果报文太长,那么IP层就需要分片,降低效率,若太短了,是IP太小。
面向字节流的传输方式就是,虽然应用程序和TCP交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流,TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。
TCP和UDP的应用
什么时候用TCP?
对网络通讯质量要求高的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
什么时候用UDP?
当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。
七、DNS
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
八、TCP连接的建立和终止
1、三次握手
TCP面向连接的,无论哪一方向另一方发送数据之前,都必须要在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息。
第一次握手,建立连接,客户端发送连接请求报文,将SYN(同步)=1,Seq(Sequence Number,序列号)=x。然后客户端进入SYN_SEND状态,等待服务器确认。
第二次握手,服务器收到SYN报文段。
- 服务器需要对这个报文段继续确认,设置ACK(Acknowledgement Number) = x+1;
- 同时自己还要再发送SYN请求信息,将SYN=1,Seq=y;
- 服务器端将上述所有信息放到一个报文段内(SYN+ACK+Seq报文段),一起发送给客户端,此时服务器进入SYN_SEND状态。
第三次,客户端收到服务器的SYN+ACK报文段。然后将ACK=y+1