计算机网络发展史
1.刚开始的时候,计算机网络里有一个专门的计算机为中心,提供远程联机系统。(就像路由器连起来打CS、饥荒,一个计算机为主机,别的辅机)
2.但是这样很不安全,如果中心机被摧毁,直接全部瘫痪。所以就提出了ARPANET,多个主机通过通信线路互联起来。实现了去中心化
3.这时百家争鸣,有很多协议、规则。两家公司的产品不能通信。这时ISO就提出了规范:开放性的标准化体系结构,OSI诞生
4.现代Internet互联网
计算机网络体系结构(重中之重)
OSI分成7层,名字得背!但是OSI时理论上的,实际应用中,大部分都是TCP/IP模型
TCP/IP模型
TCP/IP模型其实是一个TCP/IP协议族,里面有众多的协议,几十上百个吧。
里面各层比较重要的协议
传输数据的过程
数据在发送端,会一层一层往下的进行封包(将该层的必要数据封到首部),各层会将自己的要干的事+数据打包成一个新的包,传递给下层。
接收端在各层会一层一层的拆包。
这么设计的原因是:单一职责原则,各层只干自己职责内的事。
术语
各层都有自己的专业术语。一般都把数据叫包就行。
片:每次发送数据的大小为1片(2046字节)。比如要发1M的视频,在数据传输到网络层,IP协议的地方,会将1M的视频分成1000片,然后一片一片的传输过去,到接收方,TCP根据每一片的编号将其组合成1M的视频。
TCP、UDP
TCP、UDP是TCP/IP模型中传输层的协议。
TCP协议:
提供面向连接的、可靠的流协议。特点:面向连接、可靠性、RTT和RTO、数据排序、流量控制、全双工。
也就是说,利用TCP通信的两台主机首先要经历一个建立连接的过程,等到连接建立后才开始传输数据,而且传输过程中采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,发送完成后还会关闭连接。所以TCP要比UDP可靠的多。
UDP协议:
面向无连接的通讯协议
UDP是把数据直接发出去,而不管对方是不是在接收,也不管对方是否能接收的了,也不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
一般TCP用的比较多,因为可靠、安全。
UDP用的地方是不用保证数据一定能传到的情况,如视频、音频、QQ。丢几帧数据没啥事的地方。
地址和端口号
查看电脑MAC/IP等。cmd指令为 ipconfig /all
MAC地址 - 物理地址 - 物理层/链路层
物理地址,每个硬件的物理地址,BIOS烧在硬件上的。
MAC地址一共48位,前24位是IEEE给分配给每个厂商的,后面24位每个厂商自己定的。这样避免了Mac重复,如果重复也只能后24位,厂商自己的问题。
(这问题我遇到过,接摄像头的时候,由用户反应看到的是别人的家的画面。然后经过查验,发现摄像头厂商生成了两MAC一样的摄像头。)
IP地址 - 逻辑地址 - 网络层
IP地址的全称叫作互联网协议地址,它的本义是为互联网上的每一个网络和每一台主机配置一个唯一的逻辑地址,用来与物理地址作区分。
所以IP 地址用来识别 TCP/IP 网络中互连的主机和路由器。IP地址基于逻辑,比较灵活,不受硬件限制,也容易记忆。
IPv4和IPv6
IPv4:32位,4字节。XXX.XXX.XXX.XXX (0-255)所以一共 2^8*2^8*2^8*2^8 约43亿个,现在已经用完了,所以得用IPv6。
IPv6:128位。三种表示方法:冒分十六进制表示法、0位压缩表示法、内嵌IPv4地址表示法。
X:X:X:X:X:X:X:X(每个X 0~FFFF) 如果是0可以省略 直接::::
端口号 - 区分计算机里哪个进程再用 - 传输层
在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址
0~1023(知名端口号)是给协议、系统用的,不能使用。
1024~49151(正式注册)程序可以自己注册这些端口号
49152~65535 如果没有注册,系统会自动分配这里的端口号
通讯流程
TCP详解
三次握手
三次握手的本质就是客户端和服务端都有自己的一个标志位(Code值),都得告诉对方,自己的值是多少,并且确认对方已经收到。
第一次:客户端将自己的标志位发给服务器
第二次:服务器收到客户端发的标志位,给了回复并将值+1。然后服务端发自己的标志位给客户端
第三次:客户端说我已经收到了。
为什么需要3次握手
TCP是面对连接的,所以需要双方都确认连接的建立。
3次握手的漏洞-SYN洪泛攻击
客户端发生大量的第一次握手连接给服务器端,服务器端回复了以后在那等着客户端的回复。但是客户端不会回复,所以就浪费了服务器的资源。服务器就等在那了。
解决方案
无效连接监控释放
延缓TCB分配方法
防火墙:先过滤一下,如果这个连接是有效的(对方IP是真实的),再给服务器处理。
四次挥手
第一次:主动关闭端(客户端、服务器都可以,因为是全双工的),发生FIN=1(finish)seq值请求关闭连接。
第二次:服务器收到请求,说我收到了。回复ACK=1,seq=seq+1
第三次:服务器发起关闭请求FIN=1,服务器的seq值,然后进入CLOSE(正在关闭状态)
第四次:客户端回复我收到了ACK=1,seq=seq+1。并进入TIME_WAITING状态。这是还客户端没关闭,等待最多2*MSL(最大报文连接时长,最大2分钟,一般30秒)后关闭。时间到后自己就关闭了CLOSED。服务器收到客户端回复之后,自己就关闭了CLOSED。
-
为什么需要四次挥手,不像握手2.3次一起发。
因为是全双工的工(即客户端和服务器端可以相互发送和接收请求),第一次客户端说我不在发消息了;服务器说我收到了。(这时服务器可能还会再发消息)
第三次服务器说我不发消息了,(那么双方都不发消息了,这时才开始关闭)。 -
为什么需要TIME-WAIT状态
1.可靠的终止TCP连接。 不能确保服务器收到了,最后服务端给的回复(第四次挥手)。所以以防万一,还是等你一下,如果没响动一段时间,我在关闭。
2.让迟来的TCP报文,有足够的时间识别丢弃。
抓包工具 - Wireshark
Wireshark官网:www.wireshark.org/
打开以后抓的包列表:
一秒内抓的包特别多,所以需要一个过滤器。
分为两种过滤器:捕获过滤器、显示过滤器。
过滤器代码为表达式:原语+原语+...
原语=(限定词 + <id 名 数字>)
如:host 192.168.1.0 (捕获host地址为192.168.1.0这个的)
port 8080(端口号8080)
tcp (捕获tcp的)
如果要多个组合 可以 && ||连接
!udp and ip.addr==101.89.18.167
打开myaql,然后抓包,过滤tcp,前三个就是三次握手的报文。
第一次:SYN 包
第二次: SYN + ACK包
第三次:ACK包
HTTP
HTTP协议(超文本传输协议)。
URI和URL
web服务器资源的名字和用于描述一个网络上资源的地址
schema: http/https/ftp.
host: web服务器的ip地址或者域名
port: 服务端端口, http默认访问的端口是80
path: 资源访问路径
query-string: 查询参数
方法:GET/PUT/DELETE/POST/HEAD
一次完整http请求的过程
1、首先进行DNS域名解析(本地浏览器缓存、操作系统缓存或者DNS服务器)
(输入:http://www.baidu.com,先在本地缓存找IP地址,没找到去操作系统缓存找,没找到去DNS服务器找)
2、三次握手建立 TCP 连接
(得到192.11.21.1 Ip地址,三次握手建立Tcp连接)
3、客户端发起HTTP请求
4、服务器响应HTTP请求,
5、客户端解析html代码,并请求html代码中的资源
6、客户端渲染展示内容
7、关闭 TCP 连接
(http1.0的时候每次访问都是1-7,会变比连接。http1.0之后,1-6之后TCP连接不会关闭。可以重复3-6步。
http2.0有IO多路复用)
DNS劫持和HTTP劫持
DNS劫持
在输入http://www.baidu.com域名的时候,会去DNS服务器找IP地址。这时候如果通过某些技术,让DNS服务器返回一个假的IP地址,这样就连接到别的网页上去了,这就是DNS劫持。
例子:没网费的时候,会跳到充值页面,这就是运营商做的DNS劫持。还有输入网址,跳转到广告页,木马页等。
解决:重定向
HTTP劫持
在进行Http请求、Http响应的时候,请求的时候连接到别的网址,修改响应的html文件(如插入一段js,dom代码)。
例子:在访问github,响应的html里被插入了一段js的广告,弹出“我是渣渣辉,师兄弟就来砍我啊”
应用商店、运营商,点击http连接,跳转到自己的应用商店上。
解决:用https。https对客户端和服务器传递的报文加密了。(https资源消耗增加了,因为要加密解密)
应用商店会对url进行加密。防止其他应用商店、运营商跳到他的商店。