笔记:20200130
应用层
表示层
会话层
传输层
网络层
链路层
物理层
获取主机名
import socket
socket.gethostname()
通过主机名解析ip
socket.gethostbyname('LAPTOP-UPG6SFJ0')
'192.168.1.8'
socket.gethostbyname('localhost')
'127.0.0.1'
socket.gethostbyname('www.baidu.com')
'14.215.177.39'
IPv4:192.168.1.2
0--255
iPv4 :ip地址更多
127.0.0.1:本地测试ip
0.0.0.0:局域网可用ip
192.168.1.0:表示网段
192.168.1.1:网关
192.168.1.255:广播地址
2--254
ipconfig(ifconfig) ping
将ip地址转化为二进制
socket.inet_aton('192.168.1.2')
b'\xc0\xa8\x01\x02'
将二进制转化为点分十进制
socket.inet_ntoa(b'\xc0\xa8\x01\x02')
'192.168.1.2'
inet_pton inet_ntop 功能同上,只是第一个参数用soclket.AF_IENT表示IPv4 socket.AF_INET6表示IPv6
地址的组成部分,在一个系统中国区分应用程序
1-65535:1-255 众所周知的端口
256-1023 系统端口
推荐使用>10000 6666 7777 8888 9999
获取一个应用的端口
socket.getservbyname('http')
80
socket.getservbyname('ssh')
22
socket.getservbyname('https')
443
子网掩码:和ip配合过滤网段
dns:域名解析
字节序:大端序 小端序 网络字节序
面向连接---》可靠的数据传输
三次握手
1:客户端向服务端发起连接请求(询问是否可以连接)
2:服务器接收到请求后进行确认(允许连接)返回报文
3:客户端收到许可,建立连接
四次挥手
1.主动方发送报文告知被动方要断开连接
2.被动方返回报文,告知收到请求,准备断开
3.被动方发送报文给主动方告知准备就绪可以断开
4.主动方发送报文确定断开
可靠传输:无失序 无差错 无丢失 无重复
应用情况:适用于传输内容较大,网络情况好,需要提供准确传输的情况
比如:聊天信息,文件传输,邮件
面向无连接的服务---->不可靠
发送时由发送端自主进行,不考虑接收端
适应亲狂:网络较差,对传输准确性要求低,广播组播
比如:视屏会议,广播数据
套接字:进行网络通信的一种手段 socket
流式套接字(SOCK_STREAM):传输层基于tcp协议进行通信
数据报套接字(SOCK_SDGRAM):传输层基于udp协议进行通信
原始套接字(SOCK_RAM):访问底层协议的套接字
#TCP服务端
from socket import *
#创建流式套接字
sockfd = socket(AF_INET,SOCK_STREAM,0)
#绑定IP端口
sockfd.bind(('127.0.0.1',8888))
#设置监听套接字,创建监听队列
sockfd.listen(5)
while True:
print("waiting for connect....")
#等待客户端链接
connfd,addr = sockfd.accept()
print("connect from",addr)
while True:
#收发消息
data = connfd.recv(1024)
if not data:
break
print(data.decode())
#发消息
connfd.send('来,确认下眼神'.encode())
#关闭套接字
connfd.close()
sockfd.close()
#TCP客户端
from socket import *
#创建套接字
sockfd = socket(AF_INET,SOCK_STREAM)
#发起连接
sockfd.connect(('127.0.0.1',8888))
while True:
msg = input("发消息>>")
#发送消息
sockfd.send(msg.encode())
if not msg:
break
#接收消息
data = sockfd.recv(1024)
print(data.decode())
#关闭
sockfd.close()