---
jupytext:
	formats: md:myst
	text_representation:
		extension: .md
		format_name: myst
rise:
	start_slideshow_at: beginning

kernelspec:
	display_name: Python 3
	language: python
	name: python3
---


# 计算机网络概论 #

* 互联网的所有设备都有一个IP地址。


* IP地址的格式：x.x.x.x，每个x都是一个8位二进制数。所以IP地址由32位二进制数组成。


* 域名是IP地址的别称，为了方便人类记忆。比如Google主页的IP地址之一172.217.25.14，域名是google.com。


* DNS服务器里存储域名和IP地址的对应关系。


* 可以通过nslookup命令来查找域名对应的IP地址。如果你用Mac，在Launchpad里面搜索"Terminal"。如果你用的是Windows，在开始菜单中搜索"cmd"进入终端。输入"nslookup google.com"，显示类似如下结果：（返回的IP地址可能不同，与电脑配置的DNS服务器有关）

```
  nslookup google.com
  
  Server:     10.10.0.215
  Address:    10.10.0.215#53

  Non-authoritative answer:
  Name:       google.com
  Address:    172.217.25.14
```

* 路由器的作用是对数据进行转发，类似物流公司根据目的地对包裹进行中转。

* 可以通过traceroute命令来观察数据的路径。如果你用Mac，在终端里面输入"traceroute google.com"; 如果你用Windows，在终端里面输入"tracert google.com"。


# 网络协议 #

## 终端 ##
----
* 终端和我们日常用的浏览器一样，本质也是一段程序。只不过这个程序可以对电脑做更多的事情。

* 终端的界面对于某一类人群非常友好，比如工程师、科研工作者等。但对于我们普通用户来说，我们更习惯于用浏览器浏览网页。

* 浏览器的本质也是一段程序。网络通信实际上是程序和程序之间的通信。


## 客户机-服务器模型 ##
--------------
* Google.com本质也是一段程序，这段程序在google的服务器上运行。

* 访问google.com时，浏览器作为一个客户机（Client）向google的服务器发出一个请求。Google服务器（Server）响应请求并将搜索的结果返回给客户机。

![c](client-server.png)

* 可以类比我们平常去餐馆吃饭。我们点菜的时候，是作为客户在消费。我们作为消费者，角色相当于客户机，餐馆则作为服务器提供服务。一个餐馆同一时段可能要服务很多客户。同样，一台服务器同时也会处理很多客户机的请求。

* 客户机-服务器模型是现代互联网的基本架构。客户机之间交流需要通过服务器进行。现代互联网是以服务器为中心来运行的。

![s](server.png)

.. image:: server.png
   :scale: 50%

## HTTP ##
----
* HTTP：Hyper Text Transport Protocol，超文本传输协议。HTTP是一整套客户机和服务器之间的通信规范。

* 我们访问google.com，可以类比浏览器向google服务器发了一封信。信封上面除了寄信和收信地址以外，还有如下两行：

    GET /  HTTP/1.1
    HOST:  www.google.com

* GET表示浏览器希望从google服务器获取信息，HTTP/1.1表示浏览器访问google使用的是HTTP协议的1.1版本。HOST一行代表浏览器希望访问的服务器域名。

* google服务器回复了一封非常长的信。信封上面的前两行是：

    HTTP/1.1      200 OK
    Content-Type: text/html

* 信封上的信息（不管是寄信还是收信）称作HTTP header。它里面包含了寄信人和收信人的一些基本信息。日常生活中，我们寄快递需要填一个单子，收信人和寄信人是谁，里面是什么类型的物品，大概有多重，需要怎么运输，是陆运还是空运……

* 200是HTTP的状态码，表示浏览器的请求进行顺利。


HTTP的状态码还有很多，一些常用的状态码列举如下：

* 200:  OK

* 301:  Moved Permanently

* 302:  Found

* 307:  Temporary Redirect

* 401:  Unauthorized

* 403:  Forbidden

* 404:  Not Found

* 500:  Internal Server Error

* 301、302、307的含义是类似的，都意味域名资源已经改变了位置。服务器通常会发送HTTP Location来重新定向到新的位置。

* 在Chrome浏览器中我们可以记录并观察每一条网络请求的相关信息。进入chrome之后，鼠标右键->inspect->Network，然后点击Preserve Log（记录所有网络请求）。

![chrome](chrome.png)


* 在浏览器地址栏中输入google.com，你会看到工具栏中出现了很多请求。其中第一个请求状态码是301，表示google.com对应的域名资源已经改变了位置，新的域名在Response Headers中的Location里面。

![301](301.jpeg)

.. image:: 301.jpeg
   :scale: 50%

* 浏览器又向新的域名发了一次请求。第二个请求的状态码是307。意味着第一个请求返回的新的域名资源依然不存在，服务器又返回一个新的地址。

![307](307.png)


* 浏览器又向新的域名发了一次请求。第三个请求的状态码是200。意味着新的域名资源是存在的，并且返回相应的网页。

* 我们可以看到访问Google主页，浏览器总共向服务器发送了63次请求。

![R](Requests.png)


去中心化浪潮
----------

* 我们每天都在使用互联网公司提供的服务，比如通过微信服务器聊天，通过钉钉服务器上网课，通过淘宝和京东服务器网购。

* 中心化的服务器为我们的生活提供了很多便利，但也带来了很多问题，包括隐私、安全、成本昂贵、垄断等等。

* 现在科技界兴起一波“去中心化”的浪潮，目的是打破大公司的服务器在互联网中的垄断地位。

* 典型去中心化技术包括P2P和Blockchain。


WWW
---

* www是world wide web的缩写，中文又称做万维网。在互联网刚刚兴起时网站很少，为了区别于其它网络服务（如邮箱服务），很多网站习惯在域名前面加上www。

* www.qq.com是qq.com的子域名。qq.com的其它子域名还包括mail.qq.com（qq邮箱）、live.qq.com（企鹅直播）、auto.qq.com（腾讯汽车）......


##  作业 ##

完成作业：

1. 请查找自己计算机的IP地址，在本题下方放上屏幕截图。

2. 打开终端（Windows是cmd），用nslookup命令查找下列域名对应的IP地址，并在下方放上屏幕截图。

* www.baidu.com
* www.google.com
* www.scls.org.cn

3. 请用traceroute(Mac)或者tracert(Windows)命令来追踪从你的电脑到任意一个国外大学的服务器的网络路径，放上屏幕截图并回答下列问题：

    a.	请描述路径经过的地理位置，以及传输所需要的时间

    b.	第一个路由器的ip地址是多少？你认为第一个路由器在哪里？

对于traceroute命令，你可以查看：https://www.fortinet.com/cn/resources/cyberglossary/traceroutes

4. HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。 响应被归为以下五大类：

* 信息响应 (100–199)
* 成功响应 (200–299)
* 重定向消息 (300–399)
* 客户端错误响应 (400–499)
* 服务端错误响应 (500–599)

访问以下网站，通过浏览器中的开发者工具来查看网络请求和相应。其中最主要的状态码是什么？状态码在这里的作用是什么？

* 世界三流大学.com
* https://www.bilibili.com/fake
* https://docs.google.com/document/d/1Ejqwtz9M5OIxkvXcUUx3Ijk5OkbSfonGseUg9JBmJlw/edit?usp=sharing

提交方式：每位同学提交一份Word文档，截止本周日晚10点。




