网络编程
一、软件开发架构
1.c/s架构(client/server)
- c:客户端
- s:服务端
2.b/s架构(browser/server)
- b:浏览器
- s:服务器
3.b/s架构本质上也是c/s架构
手机端看上去c/s架构比较火,实际上b/s已经在崛起
微信支付宝都在做一件事:统一接口
手机端之后肯定也是bs比较火
服务端:24小时不间断提供服务
客户端:什么时候想体验服务,就去找心仪的服务端寻求服务
- 学习网络编程 就可以开发一个c/s架构的软件
并发 数据库 前端 Django 就可以一个b/s架构的软件
二、计算机通信
1、发展
- 早期的联机->以太网:局域网与交换机->广域网与路由器
2、osi七层协议
应用层
HTTP协议
FTP协议
表示层
会话层
传输层
TCP/UDP都是基于端口工作的协议
端口(port)
计算机与计算机之间其实是计算机上的应用程序与应用程序之间的通信
端口:用来唯一标识一台计算机上的某个应用程序
端口号的范围:0~65535
注意:0~1024这些都是操作系统默认使用的端口号
建议:使用8000之后的端口
MySQL默认端口号:3306
Redis默认端口:6379
django默认端口:8000
flask默认端口:5000
端口号是动态分配的
第一次启动qq分配到的是8989
将qq关闭再次启动端口号可能就变了
网络层
ip协议
规定了只要是接入互联网的计算机都必须有一个ip地址
ip地址特点:点分十进制,32为2进制数
ip地址最小:0.0.0.0
ip地址最大:255.255.255.255
ip地址目前有两个版本:IPV4和 IPV6(由于IPV4已经不够表示目前存在的计算机了,所以推出了IPV6版本)
IP地址是动态分配的
数据链路层
规定了电信号的分组方式
规定了任何一台接入互联网的计算机都必须有一块网卡,每一块网卡上面都刻有世界上独一无二的编号,这个编号叫做mac地址,它是12位16进制数,前6位是厂商编号,后6位是流水线编号
以上两点合称为“以太网协议”,基于以太网协议通信,属于局域网通信,不可以跨局域网通信
物理连接层
基于电信号传输0101二进制数据
总结:
- ip地址:用来唯一标识接入互联网的一台计算机
- port端口:用来唯一标识一台计算机上的某个应用程序
- ip+port:唯一标识接入互联网一台计算机上的某个应用程序
3、TCP协议
流式协议,可靠协议
基于TCP协议通信,必须建立双向通道
TCP协议传输数据之所以可靠地原因在于反馈机制
三次握手
客户端向服务端发送连接请求,进入待连接状态,服务端响应请求,进入待连接状态,同时服务端发送建立服务端到客户端的连接的请求,客户端响应请求,进入连接态,并发送连接成功消息给服务端,服务端受到消息后也从待连接态进入连接态。至此双向连接建立完成。途中发送了三次信息,称之为三次握手。
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态
服务器端收到SYN报文,回应一个SYN(SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态
客户端收到服务器端的SYN报文,客户端进入Established状态,回应一个ACK(ACK=y+1)报文,服务端也进入Established状态
三次握手完成,TCP客户端和服务器端成功建立连接,可以开始传输数据了
四次挥手
客户端发送消息给服务端,请求断开连接,服务端说可以断开,但先等我把数据发送完了,然后过了一段时间,服务端发送消息给客户端说,我发完了,可以断开连接了,客户端接收到消息说好的,了解。至此,双向连接断开。之间一共产生了四次消息,所以称之为四次挥手。
- 建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。
- (1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
- (2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
- 注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
- (3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
- (4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。[1]
- 既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
- 注意:
- (1) “通常”是指,某些情况下,步骤1的FIN随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。[2]
- (2) 在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭”(half-close)。
- (3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。
- 无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。[2]