今日主要内容:
一.网络通信协议
二.tcp udp协议下的socket
一.网络通信协议
1.1互联网的本质就是一系列的网络协议
本机IP地址('127.0.0.1',xxxx)
互联网连接的电脑互相通信的是电信号,
互联网协议的功能: 定义计算机如何接入Internet ,以及接入Internet的计算机通信的标准.
1.2 osi七层协议
互联网协议按照功能不同分为osi七层或tcp/udp五层或tcp/ip四层
socket 在五层通讯的应用层和传输层之间(又叫socket抽象层)
socket又称为套接字,他是应用层与tcp/udp协议族通信的中间软件抽象层,他是一组接口.
套接字socket的发展史及分类
基于文件类型的套接字家族 套接字家族的名字: AF_UNIX
Unix一切结尾文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一及其,可以通过访问同一个文件系统间接完成通信.
基于网络类型的套接字家族 套接字家族的名字 :AF_INET
(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我们只使用AF_INET)
TCP/UDP的区别(重点)
1.TCP与UDP的对比
TCP 可靠的 面向连接的协议,传输效率低全双工通信(发送缓存&接收缓存),面向字节流.
使用TCP的应用: Web浏览器 ; 文件传输程序.
UDP 不可靠的 无连接的服务,传输效率高,一对一 一对多 多对一 多对多 面向报文(数据包),尽最大努力服务,无拥塞控制.
使用UDP的应用: 域名系统(DNS),视频流,IP语音包.
由下图直接比较其中的差异
TCP和UDP下socket差异对比图:
上图只是让大家感受一下TCP和UDP协议,socket工作流程的不同,两者之间的差异是 TCP需要连接,
而UDP不需要连接.
二.tcp协议下的socket
上图就是通讯流程的大致描述
socket绑定IP和端口时可能初选下面的问题:
解决办法:
#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #在bind前加,允许地址重用
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)
但是如果你加上了上面的代码之后出现了下面这个问题: OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。如果出现了这个问题,只能换端口了,因为你的电脑不支持端口重用.
注 : 用socket进行通信,必须是一收一发对应.
2. TCP三次握手四次挥手(重点中的重点)
UDP协议下的socket
TCP 与 UDP 的区别 : 一个需要连接,一个不需要连接,但是TCP连接传输的速度相比较UDP慢,但是安全性比UDP高.