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"} 先发送报头的长度, 然后对面接受四个字节,获得报头 从报头中获取信息然后接收数据 程序两端都约定好的,就是一种自制协议,但是一个好的协议一定是最合理的,最节约时间的