网络编程——1、协议基础,点击此处。
网络编程——2、通信基础,本篇。
网络编程——3、服务器基础,点击此处。
本文为网络通信基础。
目录
一、交换机与集线器
二、arp和icmp
三、路由器简介
四、ip地址与mac地址的不同
五、访问网站过程、http服务器、dns服务器配置
六、tcp的三次握手、四次挥手
6.1 tcp的三次握手
6.2 tcp的四次挥手
6.3 tcp长连接和短连接
七、tcp的十种状态
八、2MSL问题
九、listen的队列长度
十、常见的网络攻击
10.1 tcp半链接攻击
10.2 dns攻击
10.2.1 dns服务器被劫持
10.2.2 dns欺骗
10.2.3 查看域名解析的ip地址⽅法
10.3 arp攻击
十一、家庭上网解析
集线器的作用
1、连接多台电脑组成局域网。
2、收到的每个数据包的发送都是以广播的形式进⾏的。
交换机的作用
1、交换机能够完成多个电脑的链接
2、如果每个数据包的发送都是以广播的形式进⾏的, 容易堵塞⽹络
3、如果PC不知⽬标IP所对应的的MAC, 那么, pc会先发送arp广播, 得到对⽅的MAC然后, 在进⾏数据的传送
4、当switch第⼀次收到arp⼴播数据, 会把arp⼴播数据包转发给所有端⼝(除来源端⼝) ; 如果以后还有pc询问此IP的MAC, 那么只是向⽬标的端⼝进⾏转发数据
集线器和交换机的区别?
集线器和交换机都可以组成一个局域网,集线器在收到网络中一个包时全部以广播的形式发送给局域网中每台电脑,而交换机有一个学习的功能,如果某个电脑与交换机发送过数据,交换机会记录这个电脑的mac地址和ip地址,下一次需要发送到这台电脑时会直接发送到这一台电脑上而不是广播到每台电脑。
icmp协议:ping命令使用的是icmp协议。在第一次ping对方电脑时,通常不知道对方的mac地址,需要用到arp协议获取。
arp协议:用广播的形式来获取对方mac地址(根据ip找mac地址)。由于不知道对方mac地址,发送的mac地址全为F的mac地址(广播mac地址),局域网中每个电脑都会受到,如果对方ip地址匹配时会用arp协议将自己的mac地址传输到本机。
rarp协议:根据mac地址找ip。
路由器:用于连接多个子网,具有判断网络地址和选择ip路径的功能。
注意:路由器有多个网卡,所以可以连接多个子网。
纠正:下图路由器两边红色表示不通,需要在路由器上设置每个端口时在“Port Status”的“on”上打勾!
路由器连接两个子网如下图所示:
但是现在1.X网段和2.X网段还不能ping通,因为只有路由器右边的网段是目标网段时才能ping通,即是基于下一跳的。
这时需要设置路由表!(实际使用的是RIP协议,在此手动配置)
手动设置第一个路由器表如下图:
注意:1、设置好后需要点击add才能添加到路由表中
2、子网中每台电脑需要设置正确的网关,左边电脑的网关为第一个路由器左边的ip地址,即192.168.1.254。
3、若要ping通两边需要对每个路由器设置来回的路由表!
总体如下图所示:
有了ip地址为什么还要用mac地址?
mac地址,在两个设备之间通信时在变化;而ip地址,在整个通信过程中都不会发生任何变化。
说明在最底层是以mac地址为依据进行下一跳传输。
ip:标记逻辑上的地址。
mac:标记实际转发数据时的设备地址。
netmask:和ip地址一起来确定网络号(网段)。
默认网关:发送的ip不在同一网段时,会把这个数据发送给默认网关。
访问顺序为:
1、先要解析出baidu.com对应的ip地址;
1、先要使用arp协议获取默认网关的mac地址;
2、组织数据发送给默认网关(ip为dns服务器的ip,但mac地址是默认网关的mac地址)。
3、默认网关拥有转发数据的能力,把数据转发给路由器;
4、路由器根据自己的路由协议,选择一个合适的较快的路径转发数据给目的网关;
5、目的网关(dns服务器所在的网关),把数据转发给dns服务器;
6、dns个服务器查询解析出baidu.com对应的ip地址,并原路返回送给请求这个域名的client;
2、得到了baidu.com对应的ip地址后,会发送tcp的3次握手进行连接;
3、使用http协议发送请求数据给web服务器;
4、web服务器收到数据请求后,通过查询自己的服务器得到相应的页面内容,原路返回给浏览器;
5、浏览器收到数据后显示这个页面;
6、浏览器关闭tcp连接,即4次挥手。
tcp比udp稳定的原因
长连接:3次握手后,源源不断的发送、接收数据,发送完后4次挥手结束。例如视频传输,王者荣耀等。
短连接:3次握手后发送一个数据,然后4次挥手结束,如此循环。如页面访问。
在tcp的连接过程中会进行状态的转换。
TTL:ping命令使用时会显示TTL数据,初始为128,每经过一个路由器会减1。用来表示经过路由器的个数。
MSL:一个数据包在网络上存活的最长时间。一般1~2分钟。
2MSL问题(相对于主动关闭的一方来说!在此假设主动关闭方为客户端):在四次挥手最后一个ACK确认包发送时会进入2MSL状态。为了保证对方能收到这个ACK确认包,客户端会等待2MSL的时间,因为: 1)如果服务器端能正确收到这个确认包那么服务器端会自动关闭,客户端在2MSL后收不到任何数据也会关闭;2)如果服务器不能收到这个ACK确认包,服务器在1MSL后(初始时间为客户端调用close开始!)会认为上一个数据包对方没收到,会重新发送上一个数据包,这个数据包传输到客户端时最长需要1MSL,这时客户端在1~2SML之间,所以仍在等待,保证了ACK确认包的正确接收。
以下为详细解释:
2MSL即两倍的MSL, TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的⼀端发起主动关闭, 在发出最后⼀个ACK包后,即第3次握 ⼿完成后发送了第四次握⼿的ACK包后就进⼊了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要⽬的是怕最后⼀个 ACK包对⽅没收到,那么对⽅在超时后将重发第三次握⼿的FIN包,主动关闭端接到重发的FIN包后可以再发⼀个ACK应答包。
在TIME_WAIT状态 时两端的端⼝不能使⽤, 要等到2MSL时间结束才可继续使⽤。
当连接处于2MSL等待阶段时任何迟到的报⽂段都将被丢弃。
不过在实际应⽤中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使⽤此端⼝。
在mac或windows操作系统下:
# listen中的black表示已经建⽴链接和半链接的总数
# 如果当前已建⽴链接数和半链接数以达到设定值, 那么新客户端就不会connect成功, ⽽是等待服务器。
在Linux操作系统下:
# listen中的值写什么都无所谓,都会建立连接。
tcp半链接攻击也称为: SYN Flood (SYN洪⽔)是种典型的DoS (Denial of Service, 拒绝服务) 攻击;
具体:tcp三次握手时源源不断的只发送syn,不进行ack回应。
效果:服务器TCP连接资源耗尽, 停⽌响应正常的TCP连接请求;
劫持了dns服务器,将错误的ip地址发送给源电脑,导致访问到错误的网站。
所以dns服务器相当重要!
DNS 欺骗简单来说就是⽤⼀个假的 DNS 应答来欺骗⽤户计算机,让其相信这个假的地址, 并且抛弃真正的 DNS 应答。
在⼀台主机发出 DNS 请求后, 它就开始等待应答,如果此时有⼀个看起来正确(拥有和DNS请求⼀样的序列号) 的应答包,
它就会信以为真, 并且丢弃稍晚⼀点到达的应答。
注意:可能获取多个ip地址。例如百度在全国部署了多个服务器。
当被攻击两台电脑发送arp获取mac地址时,替换对方的mac地址,这时可以获取对方的数据,然后将数据原封不动的发送给对方使对方不易察觉。
在中国家庭中的路由器功能并不单单连接两个网段,而是加强版的路由器(NAT),用于连接局域网(LAN)和外网(WAN),局域网中的ip地址外网中不可见,所以NAT相当于一个代理进行局域网ip和外网ip的地址转换,具体如下: