C/S架构:客户端与服务端架构
B/S架构:浏览器与服务端架构
想要实现通信,要具备网卡网线,网卡上有全球唯一mac地址
多台机器实现通讯要用到交换机,一台机器通过交换机寻找一台机器叫做广播,回复的过程叫做单播
arp协议:通过ip地址获取mac地址,
一台机器通过交换机要找另一台机器,然后那台机器就把自己的mac地址通过交换机回复给他
这台机器就把他的mac地址短暂缓存起来,短暂的这一段时间再想和那台机器实现通讯就不需要再广播了
机器与机器之间通过交换机连接起来形成局域网,局域网与局域网之间通过路由器连接起来
一个局域网之间的机器不能直接和另一个局域网之间的机器通信,必须通过网关
IP地址和子网掩码的按位与得到一个局域网网段
ip协议的作用:一是为每台计算机分配IP地址,二是确定那些地址在同一个子网络
一般情况下使用8000以后的端口
IP地址:一台机器在网络上的位置
IP只在局域网中生效,也就是只能被局域网中的机器通过IP+端口进行访问
想要被所有机器访问,必须申请一个公网IP,也就相当于在所有路由器上都注册了
"127.0.0.1":本地的回环地址
TCP:它是全双工(client端和server端都可以收发信息),可靠地,面向连接的,安全性高
连接时三次握手:
客户端:我可以连接你么
服务端:可以啊,我可以连接你么
客户端:可以啊
断开时四次挥手:
客户端:我要断开你了
服务端:好的
服务端:我要断开你了
客户端:好的
为什么是三次握手却是四次挥手?
因为断开的时候,客户端说要断开服务端同意,
但此时不能强制要求服务端非得断开,此时服务端还能向客户端发送消息,
如果服务端要断开,就得再次发出请求,然后客户端同意
udp:不是长连接,速度快,安全性低
udp的server端不需要监听也不需要建立连接
在启动服务后,只能被动的等待客户端发送消息过来
客户端发送消息的同时还会自带地址信息
消息回复的时候不仅需要发送消息,还需要把对方的地址填写发送过去
互联网协议按照功能不同分为tcp/ip五层:
应用层 "hello"
传输层 选择tcp/udp信息 tcp/udp协议 *tcp/udp协议属于传输层
网络层 加上ip信息 ip协议
数据链路层 加上mac地址 arp协议
物理层 无线、网卡等
基于tcp的socket:
可能会黏包不会丢包
之所以会黏包是因为:
只有在tcp协议中才会出现黏包现象
tcp协议是面向流的协议
在发送的数据过程中还有缓存机制来避免数据的丢失
因此在连续发送小数据以及接收大小不符的时候容易出现黏包
两种情况会造成黏包:
连续send两个小数据
两个recv,第一个recv非常小
解决黏包问题:
在发送大量数据之前先告诉接收端数据的大小
如果想要漂亮的解决问题可以用struct模块自定制协议
基于udp的socket:不会黏包可能会丢包
struct模块:
struct.pack("i", 1024)->将int类型的数据转换成四个字节的bytes类型
可以利用struct模块解决黏包问题,先struct.pack四个字节send过去,然后让服务端知道需要recv多长的数据
网络上传输的数据叫做数据包,数据包里的所有数据都是报文,所有的报文都有报头
利用struct模块实现大文件传输
heders = {"filename": "xxx", "filesize": 1024, "filetype": "txt", "filepath": r"c:xxx"}
先发送报头的长度,
然后对面接受四个字节,获得报头
从报头中获取信息然后接收数据
程序两端都约定好的,就是一种自制协议,但是一个好的协议一定是最合理的,最节约时间的