TCP/IP协议四层模型
IP地址实际上是一个32位整数(称为IPv4),以字符串表示的IP地址如192.168.0.1 实际上是把32位整数按8位分组后的数字表示,目的是便于阅读。
IPv6地址实际上是一个128位整数,16位分组,它是目前使用的IPv4的升级版,以字符串表示类似于2001:0db8:85a3:0042:1000:8a2e:0370:7334 。
顺便一提,IP不可靠,TCP可靠一点,IP发送给链路层数据时,有可能会造成数据丢失,TCP虽然使用的是不可靠的IP协议,仍然会有数据丢失的现象,但当数据丢失后,TCP会重新将丢失的数据发送一次,直到对应的数据送到目的地。所以相对来说是可靠的传输层协议。
eg.IP可看作是(网络层)快递公司,有丢件可能,TCP是卖家,会补发直到买家收到。
TCP的三次握手四次挥手
TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。
UDP协议
UDP,其不同于TCP,是一种不可靠的服务,但是速度快,即无法保证数据在传输的过程中不会丢失【会丢失】,常用的场景有:DNS查询、实时语音视频流传输、TFTP数据传输等
为何在这些场景中会用到UDP呢?我们拿其中一个举例,当双方通过网络进行打电话通信,如果对方说了20个字,但可能中间发生了数据丢失,即少传过来几个字,但一般来说我们还是能理解整句话是什么意思的。但若使用TCP会发生什么现象?对方说的20个字传过来18个字,因为那两个字丢失了,TCP重新发送了过来,因此可能在2s以后我们突然接收到了那两个字,这就非常的奇怪。
【用于部分数据丢失无伤大雅、严格补发反而会熵增的场合】
TCP/IP协议栈传输过程
帧是OSI模型的第2层(数据链路层)的数据包。帧是“一个数据链路层的传输单元,由一个数据链路层首部和其携带的数据包所组成”。比如:以太网帧、PPP帧等等
以太网传入的帧包含一个48位的目的地址和一个16位的以太网类型字段。其中类型字段:Ox0800(十六进制)表示这个帧包含IPv4的数据报;Ox0806和Ox86DD分别表示ARP和IPv6。假设目的地址与接收地址匹配,则会根据类型字段选择相应的网络层的协议
当到达网络层以后就会交给IP来处理,IP会检测其中的IPv4的协议字段或IPv6的下一个头部字段,来决定接下来调用哪个协议来处理。常见的协议字段有:1(ICMP)、2(IGMP)、4(IPv4)、6(TCP) 和 17(UDP)
然后到达了传输层以后,大部分的协议会通过端口号来分解到对应的应用中去。端口号是一个16位的非负整数(范围:0 ~ 65535),常见的端口号有:22(SSH)、20和21(FTP)、23(Telnet)、25(SMTP)、53(DNS)、80(HTTP)、443(HTTPS) 等
HTTP协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
HTTP是一个客户端服务器模型(B/S)客户端发起请求(Request),服务器回送响应(Response)
无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。
HTTP协议是采用URL作为定位网络资源的标识。 格式:http://host:[port]/[path]
http: 传输协议
常?的传输协议是 http 和 https,它们是限制用户与服务器间传输数据的方式与规则。http是常见协议,不安全。https是一种加密协议,HTTP下加入SSL层。
规则:建?连接通道 相互通信 关闭连接通道
host :主机域名/IP
合法的Internet主机域名或IP地址。简单来说,服务器就是另一台有许多文件可以访问的主机,域名就代表着那个主机的 IP 地址。
port :端口号
端口号是一个16位的非负整数,常见的端口号有:22(SSH)、20和21(FTP)、23(Telnet)、25(SMTP)、53(DNS)、80(HTTP)、443(HTTPS)
知名端?是众所周知的端?号,范围从0到1023。80端?分配给HTTP服务 21端?分配给FTP服务。可以理解为,?些常?的功能使?的号码是固定的,好? 电话号码110、 10086、10010?样
动态端?的范围是从1024到65535;之所以称为动态端?,是因为它?般不固定分配某种服务,?是动态分配。动态分配是指当?个系统进程或应?程序进程需要?络通信时,它会向主机申请?个端?,主机从可?的端?号中分配?个供它使?。 当这个进程关闭时,同时也就释放了所占?的端?号。
?台拥有IP地址的主机可以提供许多服务,?如HTTP(万维?服务)、FTP(?件传输)、SMTP(电?邮件)等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的?络服务呢?显然不能只靠IP地址,因为IP地址与?络服务的关系是?对多的关系。实际上是通过“IP地址+端?号”来区分不同的服务的。
然鹅,端?并不是??对应的。?如你的电脑作为客户机访问?台WWW服务器时, WWW服务器使?“80”端?与你的电脑通信,但你的电脑则可能使?“3457”这样的端?。
path
请求资源的路径。
HTTP协议对应操作
最好按惯例”对所发送的内容要求严一点,对所接收的内容宽容一些” 来处理扩展方法
B/S&C/S
C = Client, S = Server。C/S 架构即“客户端-服务器” 架构。这里的“客户端”可以是有 GUI (图形用户界面)的定制软件,也可以是浏览器,甚至可以是通过 SSH 访问服务器的命令行脚本。只要是客户端通过访问服务器调取计算或者存储资源的,统统都是 C/S 架构。
所谓的 Browser-Server 架构其实是 C/S 架构的一种特殊的实现形式,而不是其对立面.
web服务器
Web服务器(Web Server)是软件工具,用于提供HTTP\HTTPS的网络访问服务。
常用的Web服务器有:
Apatch(a patchy server):是Apache软件基金会的一个开放源码的网页服务器。 Nginx(engine x):是一款高性能的HTTP和反向代理web服务器。 Node.js:是一个基于Chrome V8的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O的模型。 Tomcat:Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 IIS(Internet Information Services):由微软公司提供的基于运行Microsoft Windows的互联网基本服务 BEA Weblogic:美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
服务器访问流程
-
地址解析 如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm 从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下: 协议名:http 主机名:localhost.com 端口:8080 对象路径:/index.htm 在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。 -
封装HTTP请求数据包 把以上部分结合本机自己的信息,封装成一个HTTP请求数据包 -
封装成TCP包,建立TCP连接(TCP的三次握手) 在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口 -
客户机发送请求命令 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。 GET ? ?于获取资源 ? 对服务器数据不进?修改 ? 不发送 Body【不发送内容】 GET /users/1 HTTP/1.1
Host: api.github.com
POST ? 用于增加或修改资源 ? 发送给服务器的内容写在Body里面【发送内容】 POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded //👈表单
Content-Length: 13
name=rengwuxian&gender=male
👆body信息(表单)
PUT——纯写入。PUT方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名 的新文档, 或者, 如果那个URL已经存在的话, 就用这个主体来替代它。
-
服务器响应 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码【状态码】,后边是MIME信息包括服务器信息、实体信息和可能的内容。 实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据 -
服务器关闭TCP连接 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持TCP连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTP状态码
服务器接到请求后,会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
分类 | 分类描述 |
---|
1** | CONTINUE信息,服务器收到请求,需要请求者继续执行操作 | 2** | 成功,操作被服务器成功接收并处理 | 3** | 重定向,需要进一步的操作以完成请求 | 4** | 客户端错误,请求包含语法错误或无法完成请求 | 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的HTTP状态码:
- 1xx:临时性消息。如:100(继续发送)、101(正在切换协议)
? 2xx:成功。最典型的的是200(OK)、201(创建成功)
? 3xx:重定向。如:301(永久移动)302(暂时移动)、304(内容未改变)
? 4xx:客户端错误。如:400(客户端请求错误)、401(认证失败)、403(被禁止)、404(找不到内容)
? 5xx:服务器错误。如:500(服务器内部错误)
缓存cache与缓冲buffer
cookie
Cookie是由服务器发送的key-value标示符。因为HTTP协议是无状态的,但是服务器要区分到底是哪个用户发过来的请求,就可以用Cookie来区分。当一个用户成功登录后,服务器发送一个Cookie给浏览器,例如user=ABC123XYZ(加密的字符串)... ,此后,浏览器访问该网站时,会在请求头附上这个Cookie,服务器根据Cookie即可区分出用户。
Cookie还可以存储网站的一些设置,例如,页面显示的语言等等。
Socket
通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
客户端编程
我们要创建一个基于TCP连接的Socket,可以这样做:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('www.sina.com.cn', 80))
AF_INET 指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6 SOCK_STREAM 指定使用面向流的TCP协议
建立TCP连接后,我们就可以向新浪服务器发送请求,要求返回首页的内容:
s.send(b'GET / HTTP/1.1\r\n
Host: www.sina.com.cn\r\n
Connection: close\r\n\r\n')
TCP连接创建的是双向通道,双方都可以同时给对方发数据。但是谁先发谁后发,怎么协调,要根据具体的协议来决定。例如,HTTP协议规定客户端必须先发请求给服务器,服务器收到后才发数据给客户端。
接下来就可以接收新浪服务器返回的数据了:
buffer = []
while True:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
接收数据时,调用recv(max) 方法,max表示一次最多接收指定的字节数,因此,在一个while循环中反复接收,直到recv() 返回空数据,表示接收完毕,退出循环。
接收完数据后,调用close() 方法关闭Socket,这样,一次完整的网络通信就结束了:
# 关闭连接:
s.close()
- 创建socket s=socket.socket(xx.a,xx.b)
- 建立连接 s.connect(‘域名’,端口号)
- 发送请求 s.send(b’PUSH /xxx)
- 接收数据 buffer= []{ xxx}
- 关闭连接 s.close()
接收到的数据包括HTTP头和网页本身,我们只需要把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件:
header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
with open('sina.html', 'wb') as f:
f.write(html)
服务器编程
|