OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):链路层、网络层、传输层、应用层。
1)链路层:也称为数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和相对应的网络接口卡。
2)网络层:处理分组在网络中的活动,例如分组。包括IP协议、ICMP协议和IGMP协议。
3)传输层:为两台主机上的应用程序提供端到端的通信。包括TCP协议和UDP协议。
4)应用层:负责处理特定的应用层序细节。
路由器为不同类型的物理网络提供连接。
图1-3是两个网络的互连网:一个以太网和一个令牌网,通过一个路由器互连。可将其划分成端系统(两边的主机)和中间系统(中间的路由器)。应用层和传输层使用端到端(End-to-end)协议,网络层提供的却是逐跳(Hop-by-hop)协议。
连接网络的另一个方法是使用网桥。网桥是在链路层上对网络进行互连,而路由器是在网络层上对网络进行互连。网桥使用多个局域网(LAN)组合在一起,这样对上层来说好像是一个局域网。TCP/IP倾向于使用路由器而不是网桥来连接网络。
1)ARP和RARP是某些网络接口使用的特殊协议,用来转换IP地址和MAC地址。
2)ICMP(因特网控制报文协议):IP协议的附属协议,IP层用它来与其他主机或路由器传递控制信息。控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 ICMP 报文有两种:差错报告报文和询问报文。
3)IGMP(Internet组管理协议):用它来把一个UDP数据报多播到多个主机。
4)IP:提高不可靠、无连接的数据传输服务。
不可靠(unreliable):不能保证IP数据报能成功到达目的地,IP仅提供尽力而为的传输服务。如果发生错误时,如路由器暂时用完缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。
无连接(connectionless):IP并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的。
5)UDP:一个简单的面向数据报的传输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。不提供可靠性、无连接的数据传输协议,会发生丢包、乱序等情况。
6)TCP:提供一种面向连接的、可靠的字节流服务。在一个TCP连接中仅有两方进行彼此通信。在数据传递时,有确认机制、重传机制、流量控制、拥塞控制等,可以保证数据的正确性和有序性。
7)TFTP协议:是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
8)HTTP协议:超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
9)NAT协议:网络地址转换属接入广域网(WAN)技术,是一种将私有地址转化为合法IP地址的转换技术。
10)DHCP协议:一个局域网的网络协议,使用UDP协议工作,用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
11)FTP:定义了文件传输协议,使用21端口。
12)Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
13)SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
14)POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
15)DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
16)SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
基于UDP:DNS、TFTP、RIP、BOOTP、DHCP、SNMP、NFS、IGMP
基于TCP:SMTP、TELNET、HTTP、FTP
D类地址用于多点广播(Multicast),多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。E类IP地址为将来使用保留。
RFC1918文件规定了保留作为局域网使用的私有地址:
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
IP地址中关键是主机位,将子网掩码划为二进制,1对应上面的地址是网络位,0对应的地址是主机号
192.168.19.1/20: 20表示子网掩码1的个数
IP地址:11000000.10101000.00010011.00000001 子网掩码:11111111.11111111.11110000.00000000
主机位变成全0表示这个IP的网络地址,主机位变成全1表示这个IP的广播地址。
当应用程序用TCP传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当做一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),如图1-7所示。
TCP传给IP的数据单元称为TCP数据段或简称TCP段(TCP segment);UDP传给IP的信息单元称作UDP数据报(UDP datagram),且UDP首部长8字节;IP传给网络接口层的数据单元称作IP数据报(IP datagram);通过以太网传输的比特流称为帧(Frame)。
以太网数据帧的物理特性使其长度必须在46~1500字节之间。更准确地说,IP和网络接口层之间传送的数据单元应该称为分组(packet),分组既可以是一个IP数据报,也可以是IP数据报的一个片(fragment)
TCP和UDP采用16bit的端口号来识别应用程序。常见的端口号及服务如下:
服务 |
端口号 |
服务 |
端口号 |
FTP |
21 |
SSH |
22 |
telnet |
23 |
SMTP |
25 |
Domain( 域名服务器) |
53 |
HTTP |
80 |
POP3 |
110 |
NTP (网络时间协议) |
123 |
MySQL 数据库服务 |
3306 |
Shell 或 cmd |
514 |
POP-2 |
109 |
SQL Server |
1433 |
1)首先,每个主机都会在自己的ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
2)当源主机要发送数据时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据;如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址。
3)当本网络的所有主机收到该ARP 数据包时,首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包;如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖,然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
4)如果源主机收到ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据;如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。
广播发送 ARP 请求,单播发送ARP响应
1)搜索路由表,寻找与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
2)搜索路由表,寻找能与目的网络号相匹配的表目。若找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。目的网络上的所有主机都可以通过这个表目来处理。
3)搜索路由表,寻找默认表目。若找到,则把报文发送给该表目指定的下一站路由器。
注:完整主机地址匹配在网络号匹配之前执行。只有当他们都失败后才选择默认路由。为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是IP路由选择机制的另一个基本特性。
ping命令主要是用于检测网络的连通性。
Ping命令发送一个ICMP回显请求报文给目的IP,并等待返回ICMP回显应答报文。
原理:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。
ping其实还有一个R选项,用来记录经过的路由,但最多可以记录9个路由。
1)首先考虑是否是网络的问题
2)局域网设置问题,电脑互联是要设置的。看是否安装了必要的网络协议,最重要的是 IP 地址是否设置正确。
3)网卡驱动未安装正确
4)防火墙设置有问题
6)是否有什么软件阻止了ping 包
Traceroute程序可以记录IP数据报从一个主机传到另一个主机所经历的路由。主要利用IP首部的TTL字段,该字段目的是防止数据报在选路时无休无止地在网络中流动。当路由收到一份IP数据报,如果其TTL字段是0或者1,则路由器不转发该数据报(接收到这种数据报的目的主机可以将其交给应用程序,因为不需要转发)。相反,路由器将该数据报丢弃,并给信源机发送一份ICMP“超时”信息。Traceroute程序的关键在于包含这份ICMP信息的报文的信源地址是该路由器的IP地址。
首先,Traceroute发送一份TTL是1的IP数据报给目的主机,当路径上的第一个路由器收到IP数据报时,将TTL减1,丢弃该 IP数据报,并返回一个超时的ICMP报文。当Traceroute收到这个消息后,接着继续发送TTL为2的IP数据报,这样便可以得到第二个路由器地址。以此类推,直到IP数据报达到目的主机,但目的主机接收到TTL为1的IP数据报,也不会丢弃该数据报并产生一份超时ICMP报文。解决方法是Traceroute发送一份UDP数据报给目的主机,但选择一个不可能的值作为UDP的端口号,使目的主机任何一个应用程序都不能使用该端口,会产生一个ICMP端口不可达报文。Traceroute程序区分接收到的ICMP报文时超时还是端口不可达,以判断是否结束。
1)显示和修改本地ARP列表——ARP
a) ARP –a 显示本地ARP列表
b) arp -s ip地址 MAC地址 添加静态一条ARP信息
2)查看网络配置信息命令——Ipconfig
使用不带参数的Ipconfig就可以显示所有适配器的 IP 地址、子网掩码和默认网关
3)显示网络连接信息——netstat
a) netstat –a 显示本机所有活动的TCP连接以及计算机侦听的TCP和UDP端口
b) netstat –n 或者netstat(不带参数) 显示当前活动的TCP/IP连接
c) netstat –se 显示以太网统计信息和所有协议的统计信息
d) netstat –rn 检查路由表确定路由配置情况
4)网络连通测试命令——Ping
在网络中,经常会出现网络不通等问题,这就需要网络管理员来检查并排除网络故障,包括检查网络配置信息,检查硬件连接,使用网络命令测试等,而在命令检测中,用得最多的就是Ping命令了。
5)显示和修改本地路由表命令——route
用来显示、人工添加和修改路由表项目。
6)数据包跟踪诊断——tracert
一般用来检测故障的位置,通过追踪路由,可以判断发生故障的路由设备或网关,以及发生故障的区段,从而便于查找和排除故障。
1) TCP是稳定、可靠、面向连接的传输层协议,它在传递数据前要三次握手建立连接,在数据传递时,有确认机制、重传机制、流量控制、拥塞控制等,可以保证数据的正确性和有序性。
2) UDP是无连接的数据传输协议,端与端之间不需要建立连接,且没有类似TCP的那些机制,会发生丢包、乱序等情况。
3) TCP是数据流模式,而UDP是数据报模式。
1)“流模式”,是指TCP发送端发送几次数据和接收端接收几次数据是没有必然联系的,比如你通过 TCP 连接给另一端发送数据,你只调用了一次 write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次 write,每次10个字节,但是对方可以一次就收完。
原因:这是因为TCP是面向连接的,一个 socket 中收到的数据都是由同一台主机发出,且有序地到达,所以每次读取多少数据都可以。
2)“数据报模式”,是指UDP发送端调用了几次write,接收端必须用相同次数的 read 读完。UDP 是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。
原因:这是因为UDP是无连接的,只要知道接收端的 IP 和端口,任何主机都可以向接收端发送数据。 这时候, 如果一次能读取超过一个报文的数据, 则会乱套。
要实现数据的安全传输,当然就要对数据进行加密了。如果使用对称加密算法,加解密使用同一个密钥,除了自己保存外,对方也要知道这个密钥,才能对数据进行解密。如果你把密钥也一起传过去,就存在密码泄漏的可能。所以我们使用非对称算法,过程如下:
首先 接收方 生成一对密钥,即私钥和公钥;然后,接收方将公钥发送给发送方;发送方用收到的公钥对数据加密,再发送给接收方;接收方收到数据后,使用自己的私钥解密。由于在非对称算法中,公钥加密的数据必须用对应的私钥才能解密,而私钥又只有接收方自己知道,这样就保证了数据传输的安全性。
为什么连接的时候是三次握手,关闭的时候却是四次握手
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
TIME_WAIT状态的产生、危害、如何避免
产生原因:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
危害:Linux分配给一个用户的文件句柄是有限的,如果系统中存在大量的 time_wait 状态,一旦达到句柄数上限,新的请求就无法被处理了,而且大量 time_wait 连接占用资源影响性能。
如何避免:在/etc/sysctl.conf文件中开启net.ipv4.tcp_tw_reuse重用和net.ipv4.tcp_tw_recycle快速回收。
TCP是通过滑动窗口来进行流量控制,在TCP头部里有一个字段叫 Advertised-Window(即窗口大小)。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据,于是发送端就可以根据这个剩余空间来发送数据,而不会导致接收端处理不过来。
下面是发送端的滑动窗口示意图:
接收端在给发送端回ACK中会汇报自己的Advertised-Window 剩余缓冲区大小,而发送方会根据这个窗口来控制下一次发送数据的大小。下面是滑动后的示意图(收到36的ack,并发出了46-51的字节):
Zero Window:如果接收端处理缓慢,导致发送方的滑动窗口变为0了,怎么办?—— 这时发送端就不发数据了,但发送端会发ZWP(即Zero Window Probe技术)的包给接收方,让接收方回ack更新Window尺寸,一般这个值会设置成3次,每次大约30-60秒。如果3次过后还是0的话,有的TCP实现就会发RST把连接断了。
Silly Window Syndrome:即“糊涂窗口综合症”,当发送端产生数据很慢、或接收端处理数据很慢,导致每次只发送几个字节,也就是我们常说的小数据包——当大量的小数据包在网络中传输,会大大降低网络容量利用率。比如一个20字节的TCP首部+20字节的IP首部+1个字节的数据组成的TCP数据报,有效传输通道利用率只有将近1/40。
为了避免发送大量的小数据包,TCP提供了Nagle算法,Nagle算法默认是打开的,可以在Socket设置TCP_NODELAY选项来关闭这个算法。
TCP通过一个超时定时器采样了RTT(往返时间)并计算RTO(重传时间超时),TCP的拥塞控制机制减少网络负担。在发送端调节所要发送的数据量,定义了一个“拥塞窗口”(cwnd),在发送数据时,取拥塞窗口与接收端ACK的通告窗口大小的较小者作为发送数据量的上限。
假设当cwnd为32个报文长度时发生阻塞,则设置ssthresh为16个报文长度(ssthresh大小至少为两个报文长度)。
拥塞控制主要是四个算法:
1) 慢启动:刚刚加入网络的连接,一点一点地提速,不要一上来就把路占满。
a) 连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。
b) 每当收到一个ACK,cwnd++; 呈线性上升
c) 每当过了一个RTT,cwnd = cwnd*2; 呈指数让升
d) 阈值ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”
2) 拥塞避免:当拥塞窗口 cwnd 达到一个阈值时,窗口大小不再呈指数上升,而是以线性上升,避免增长过快导致网络拥塞。
a) 每当收到一个ACK,cwnd = cwnd + 1/cwnd
b) 每当过了一个RTT,cwnd = cwnd + 1
3) 拥塞发生:当发生丢包进行数据包重传时,表示网络已经拥塞。分两种情况进行处理:
A. 等到RTO超时,重传数据包
a) sshthresh= cwnd /2
b) cwnd重置为 1
c) 进入慢启动过程
B. 在收到3个duplicate ACK时就开启快速重传,而不用等到RTO超时
a) cwnd= cwnd /2
b) sshthresh= cwnd
c) 进入快速恢复算法——Fast Recovery
4) 快速恢复:至少收到了3个Duplicated Acks,说明网络也不那么糟糕,可以快速恢复。
a) cwnd= sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了)
b) 重传Duplicated ACKs指定的数据包
c) 如果再收到 duplicated Acks,那么cwnd = cwnd +1
d) 如果收到了新的ACK,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。
算法存在的问题:依赖于3个重复的Acks。注意,3个重复的Acks并不代表只丢了一个数据包,很有可能是丢了好多包。但这个算法只会重传一个,而剩下的那些包只能等到RTO超时,于是,进入了恶梦模式——超时一个窗口就减半一下,多个超时会超成TCP的传输速度呈指数级下降,而且也不会触发Fast Recovery。