IP地址
- A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255
- B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255
- C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255
网络层与协议
应用层(表示层 / 会话层) | FTP / SMTP / POP3 / HTTP |
传输层 | TCP / UDP |
网络层 路由层 | ICMP:错误报文 ARP:IP地址到物理地址查询 RARP:mac地址到IP地址查询 IP,IGMP,DHCP |
数据链路层 交换机,网桥 | PPP HDLC ARQ CSMA(载波监听,判定通信通道) |
物理层 |
TCP协议:FTP、Telnet、SMTP、POP3、HTTP
UDP协议:DNS、SNMP、TFTP
访问一个网页的过程:
- IP获取DNS解析(本地/更高层次的DNS服务器)
- 建立TCP连接
- OSPF找出最佳路径
- ARP协议负责求下一个节点Mac地址
- 返回渲染
TCP头部字段:
sequence number:包的序号
acknowledgement number:ACK,解决不丢包的问题
advertised-window:滑动窗口
TCP Flag:包的类型,操作TCP状态机
UDP头部字段:
三次握手:
等待2MSL的意义?
MSL:报文段最大生存时间,任何报文段被丢弃前在网络内的最长时间
(1)保证全双工连接能可靠关闭
如果服务器最后给客户端最后的确认发送直接关闭,且该确认没有到达客户端,客户端会发起新的关闭请求,此时已找不到对应的连接。
(2)保证此次连接数据已经在网络中消失
如果服务器直接CLOSED了,之后又和客户端建立了端口都一致的全新连接,此时上一次连接中的某个滞留数据到了,就可能以为是新连接的数据
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN WAIT1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态
TIME_WAIT意义:
主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了
MSL是指Max Segment Lifetime,即数据包在网络中的最大生存时间
- 解决有足够时间让对端收到ACK
- 有足够时间让这个连接不会与后面混在一起
- 如果最后的ACK丢失,TCP必须要维护着TCP状态以便重新发送最后的ACK信息
服务器大量TIME_WAIT的原因:“高并发-短连接”
- 主动正常关闭TCP连接,都会出现TIMEWAIT
- 高并发:短时间范围同时占用大量端口
- 短连接:业务+传输数据的时间 远远小于TIMEWAIT超时的连接
TIME_WAIT的解决:
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 #net.ipv4.tcp_timestamps 开启时,net.ipv4.tcp_tw_recycle开启才能生效
net.ipv4.tcp_timestamps = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。net.ipv4.tcp_fin_timeout = 2 #用来设置保持在FIN_WAIT_2状态的时间
保存后sysctl -p生效
TCP-------为什么会有TIME_WAIT状态 ?_11849650的技术博客_51CTO博客
三次握手的必要性:
防止已失效的请求报文段突然又传送到了服务端而造成连接的误判。假如客户端发出连接请求A,由于网络原因,服务端并没有收到A,于是客户端又发送了连接请求B,并建立了连接,完成通信,断开连接。这时候,服务端突然又收到了A,于是看作是一次新的连接请求,进行第二次握手,由于不存在第三次握手,所以这时已经建立了TCP连接。但实际上客户端并没有发起连接,所以不会传递数据,那么这条连接就会变成一条死连接。
TCP四次握手的必要性:TCP是全双工通信的
(1)第一次挥手(代表含义:客户端不再发送新的数据了)
因此当主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但主动方仍可以接收数据报文。
(2)第二次挥手(代表含义:服务端知道客户端想断开了)
被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我知道你想断开连接的请求了”。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即FIN报文)。
(3)第三次挥手(代表含义:客户端你的数据我服务端处理完了,可以断开了)
被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待)。我处理完了
(4)第四挥手 (代表含义:好的,我走了)
如果主动方及时发送ACK报文进行连接中断的确认,这时被动方就直接释放连接,进入可用状态
TCP拥塞控制: 资源(带宽、交换节点的缓存、处理机)的需求>可用资源
作用:拥塞控制就是为了防止过多的数据注入到网络中,网络能够承受现有的网络负荷
慢启动,拥塞避免,拥塞发生,快速恢复
TCP滑动窗口:cwnd(拥塞窗口) 解决可靠传输以及包乱序问题
Advertised-window:接收端告诉发送端自己还能有多少缓冲区接收数据,发送端根据这个接收端处理能力发送数据。
- 接收端在ACK中反馈自己的空间
- 发送方根据反馈自己调节发送数据的大小
慢启动:
慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小。
拥塞避免:
为了防止cwnd增加过快而导致网络拥塞,所以需要设置一个慢开始门限ssthresh状态变量(我也不知道这个到底是什么,就认为他是一个拥塞控制的标识),它的用法:
- 当cwnd < ssthresh, 使用慢启动算法
- 当cwnd > ssthresh, 使用拥塞控制算法
- 当cwnd = ssthresh,这两个算法都可以
拥塞避免:是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。
可能一:发生网络拥塞后,门限降半并从头开始慢启动
无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为设置为发送窗口的一半(>=2),cwnd(拥塞窗口)设置为1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长,比慢启动算法拥塞窗口增长块的多。
举例:
- TCP连接进行初始化的时候,cwnd=1,ssthresh=16。
- 在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh =cwnd时,就启动拥塞控制算法,拥塞窗口按照规律增长,
- 当cwnd=24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh=12,(二分之一cwnd),设置cwnd=1,然后开始慢启动算法,当cwnd=ssthresh=12,慢启动算法变为拥塞控制算法,cwnd按照线性的速度进行增长。
可能二:发生三次重复确认,将门限降半从门限处开始拥塞避免
快重传:
快重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。
快启动:
- 当发送端连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。
- 此时不执行慢启动算法,而是把cwnd设置为ssthresh的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。
TCP拥塞控制-慢启动、拥塞避免、快重传、快启动 - 致林 - 博客园
特殊情况:若发送端不发送,当接收方有window size可用,会发送zwp包给接收方
总结:
慢启动 | cwnd=cwnd+1/cwnd cwnd=cwnd+1 |
拥塞避免 | 1、超时:sshthresh=cwnd/2;cwnd=1 2、收到3个ACK:sshthresh=cwnd;cwnd=cwnd/2 |
拥塞发生 | |
快速恢复 | 重传指定包:cwnd=sshthresh+3*MSS 若再收到ACK:cwnd=cwnd+1 若收到新的ACK:cwnd=sshthresh |
UDP实现可靠传输
最简单的方式是在应用层模仿传输层TCP的可靠性传输(在应用层实现)。下面不考虑拥塞处理,可靠UDP的简单设计。
- 1、添加seq/ack机制,确保数据发送到对端
- 2、添加发送和接收缓冲区,主要是用户超时重传。
- 3、添加超时重传机制。
开源实现的举例:RUDP、RTP、UDT
keepAlive
(1)TCP:一直不断发送空报文,确保对方一直在线
KeepAlive。链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。
TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。
(2)HTTP:不立即关闭TCP连接
开启HTTP Keep-Alive之后,能复用已有的TCP链接,当前一个请求已经响应完毕,服务器端没有立即关闭TCP链接,而是等待一段时间接收浏览器端可能发送过来的第二个请求,通常浏览器在第一个请求返回之后会立即发送第二个请求,如果某一时刻只能有一个链接,同一个TCP链接处理的请求越多,开启KeepAlive能节省的TCP建立和关闭的消耗就越多。
当然通常会启用多个链接去从服务器器上请求资源,但是开启了Keep-Alive之后,仍然能加快资源的加载速度。HTTP/1.1之后默认开启Keep-Alive, 在HTTP的头域中增加Connection选项。
HTTP方法:GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT
HTTP请求报文:
HTTP响应报文:
HTTP请求头部:
- Host
- User-Agent
- Connection
- Accept-Charset
- Accept-Encoding
- Accept-Language
HTTP响应头部:
- Server
- Content-Type
- Content-Length
- Content-charset
- Content-Encoding
- Content-Language
与缓存有关的首部字段:
- Last-Modified 和 if-Modified-Since 记录页面最后修改时间
- ETag 和 if-None-Match 常用判断资源是否改变
- Expires、Cacahe-Control 控制失效日期
HTTP1.0 与HTTP 1.1区别:HTTP 与 HTTPS 的区别 | 菜鸟教程
- HTTP 1.0默认短连接,要建立长连接,需要keep-alive头域;HTTP 1.1 默认持久连接
- HTTP 1.1引入分块传输状态码100 发送post数据之前,客户端先发送100询问服务器是否接收大于1024的数据。Request中多了Host域 (一台物理服务器可存在多个虚拟主机)
HTTPS:
- CA: 证明服务器用途类型的证书,客户端信任该证书从而信任主机
- SSL:(1)认证用户 (2)加密 (3)维护完整性
HTTPS过程:
- 客户端发起https请求
- 服务端传输证书(公钥)
- 客户端解析证书
- 客户端传输加密信息
- 服务端解密信息
- http:明文传输不安全,端口80
- https:基于ssl协议,端口443
HTTP响应:
- 1xx:临时响应
- 2xx:成功
- 3xx:重定向
- 4xx:错误
- 5xx:服务器错误
常见的状态码:
- 304:自上一次,网页没有修改,响应但不返回内容
- 403:服务器拒绝请求
- 404:服务器找不到请求
- 500:服务器内部错误
- 502:服务器异常,无响应
- 503:临时服务器过载
- 504:服务器请求超时
WebSocket:
Http1.0 的生命周期是一个request
Http1.1 对Http1.0进行了改进,有keep-alive,可以发送多个request
WebScoket是Http协议支持长连接的补丁,加入了upgrade、correction。解决了1被动性,服务端主动给给客户端发送包(以HTTP形式)
路由器表中存放内容:
目的网段、子网掩码、网关、接口
- 交换机:同一个网络数据交换
- 路由器:内外网使用
路由器选择协议:
- 内部协议:RIP(应用层协议):维护到目的端的最短距离;OSPF(网络层协议):Dijkstra算法 当链路器状态发生变化时,路由器用洪泛法更新
- 外部协议:BGP(应用层协议):选择一个路由器作为BGP发言人,力求寻找一条能达到目的网络且性能比较好的路由(并非最佳)
- NAT协议:内部服务、外部服务网络转化
内部网络<--->NAT<--->外部网络
Cookie的作用:存放数据 + 用户身份
ping命令过程:
1.STMP协议 ---> 2.打包成IP包 ---> 3.目的端是否同网络?(1.是否有mac信息?有就用 2.没有要调用ARP) ---> 4.接收,将IP帧取出,有价值的信息用ICMP应答
|
不同网络?交给路由器
网络功能四大类:
- InetAddress 硬件资源
- URL 资源定位符
- Sockets TCP(ServerSocket类--------Socket类)
- Datagram UDP(DatagramSocket类--------DatagramSocket)
Nagle算法:当数据小时会合并到大包中发送,在发送下一个数据包中会等待前一个包的响应
TCP NO DELAY:将Nagle算法关闭,无论数据包大小都会发送出去
网络安全:
SYN Flood攻击:建立连接,客户端下线。解决方法:用Cookie
ARP攻击:伪造IP与Mac地址,向服务端发送虚假包欺骗服务器(IP不存在,使服务器必须开启监听等待)
DDos攻击:分布式拒绝服务攻击
利用目标系统网络服务功能或者直接消耗其系统资源,使该目标系统无法提供正常服务
攻击者发送请求后,把window设置为0,服务端只能进行zwp
Xss攻击:尽一切办法在目标网站上执行非目标网站上原有的脚本
CSRF攻击:盗用身份,发送恶意请求。源于web隐式身份验证机制;解决:客户增加伪随机数验证
LAND attack:机器死循环,消耗资源而死机
ICMP floods:向未良好设置的路由器发送广播信息 现象:大量等待的TCP连接,大量无用的数据包
Socket
服务端:
1. 创建一个ServerSocket对象
ServerSocket server=newServerSocket(port,queueLength);
2. 调用Serversocket的accept()方法监听客户机
Socket connection=server.accept();
3. 获得OutStream和InputStream对象
ObjectInputStream input=new ObjecInputStream(connection.getInputStream());
ObjectOutputStream output=new ObjectOutputStream(connection.getOutputStream());
4. 服务器和客户机通过OutStream和InputStream对象通信
5. 如果传输结束,通过调用相关流的close()以及Socket的close()关闭连接
服务端:
1. 创建一个Socket用来连接到服务器上
Socket connection=new Socket(serverAddress,port);
2. Socket的getInputStream方法和getOutputStream方法分别用于获得与Socket相关联的InputStream和OutputStream的引用
ObjectionInputStream input=new ObjectInputStream(connection.getInputStream());
ObjectionOutputStream output=new ObjectOutputStream(connection.getOutputStream());
3. 客户机与服务器通过InputStream和OutputStream对象通信的处理阶段
4. 如果传输结束,通过调用相关流的close()以及Socket的close()关闭连接
划分网络问题:
一家公司有12个子公司,每家有4个部门,上级给出172.16.0.0/16网络,如何划分网络?
2的四次方>12,因此用4位表示
(1)划分各子公司所属网段
10101100.0001000.00000000.00000000/20
10101100.0001000.00010000.00000000/20
10101100.0001000.00100000.00000000/20
10101100.0001000.00110000.00000000/20
......
10101100.0001000.11110000.00000000/20
(2)再划分子公司部门所属网段2个
10101100.0001000.00000000.00000000/20
......
子网掩码:将IP地址划分为网络地址和主机地址两部分 IP地址24位代表子网络,后8位代表主机号
子网掩码:24个1,8个0 即255.255.255.0
某地址所属网络 = IP & 子网掩码