<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>14 on 中二青年</title>
    <link>https://zhong-er.com/tags/14/</link>
    <description>Recent content in 14 on 中二青年</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 08 Aug 2019 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://zhong-er.com/tags/14/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【网络编程】Socket</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bsocket/</link>
      <pubDate>Thu, 08 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bsocket/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;网络编程(三).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908085255_559_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程(三) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/FpZaknXLa&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11322341.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基于TCP协议使用socket分发大文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;案例：电影上传&lt;/p&gt;
&lt;p&gt;思路：客户端端循环一行一行读文件并一行一行传输，服务端循环接收并写入文件&lt;/p&gt;
&lt;p&gt;客户端代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket,json,os,struct
client = cocket.socket()
client.connet((&#39;127.0.0.1&#39;,8080))
while True:
    # 获取电影类表，循环展示
    MOVIE_DIR = r&#39;D:\路径\视频&#39;
    movie_list = os.listdir(MOVIE_DIR)
    for i,movie in enumerate(movie_list,1):
        print(i,movie)
    # 用户选择
    choice = input(&#39;please choice movie to upload&amp;gt;&amp;gt;&amp;gt;:&#39;)
    # 判断是否是数字
    if choice.isdigit():
        # 将字符串转为int
        choice = in(choice) - 1
        # 判断用户选择在不在列表范围内
        if choice in range(0,len(movie_list))
           # 获取用户想上传的文件路径
            path = movie_list[choice]
           # 拼接文件的绝对路径
           file_path = os.path.join(MOVIE_DIR,path)
           # 获取文件的大小
           file_size = os.path.getsize(file_path)
           # 定义一个字典
           res_d = {
                      &#39;file_name&#39;:&#39;性感荷官在线发牌.,mp4&#39;,
                      &#39;file_size&#39;:file_size,
                      &#39;msg&#39;:&#39;注意身体，多喝营养快线&#39;
           }
           # 序列话字典
           json_d = json.dunps(res_d)
           json_bytes = json_d.encode(&#39;utf-8&#39;)
           # 1.先制作字典格式的报头
           header = struct.pack(&#39;i&#39;,len(json_bytes))
           # 2.发送字典的报头
           client.send(header)
           # 3.再发字典
           client.send(json_bytes)
           # 4.再发文件数据(打开文件循环发送)
           with open(file_path,r&#39;b&#39;) as f:
               for line in f:
                   client.send(line)
        else:
           print(&#39;not in rang&#39;)
    else:
        print(&#39;must be a number&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;服务端代码&lt;/p&gt;</description>
    </item>
    <item>
      <title>【网络编程】TCP协议与粘包问题</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E4%B8%8E%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98/</link>
      <pubDate>Wed, 07 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E4%B8%8E%E7%B2%98%E5%8C%85%E9%97%AE%E9%A2%98/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;网络编程(二).png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908079748_6105_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程(二) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/M0ZxVWd7a&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11317624.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基于TCP协议的Socket套接字&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;server端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket
sk = socket.socket()
sk.bind((&#39;127.0.0.1&#39;,8898))  # 把地址绑定到套接字
sk.listen()          # 监听链接
conn,addr = sk.accept() # 接受客户端链接
ret = conn.recv(1024)  # 接收客户端信息
print(ret)       # 打印客户端信息
conn.send(b&#39;hi&#39;)        # 向客户端发送信息
conn.close()       # 关闭客户端套接字
sk.close()        # 关闭服务器套接字(可选)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;client端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import socket
sk = socket.socket()           # 创建客户套接字
sk.connect((&#39;127.0.0.1&#39;,8898))    # 尝试连接服务器
sk.send(b&#39;hello!&#39;)
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;127.0.0.1本机回还地址：只能自己识别自己 其他人无法访问&lt;/p&gt;
&lt;p&gt;send与recv对应，不要出现两边都是相同的情况&lt;/p&gt;
&lt;p&gt;recv是跟内存要数据，至于数据的来源 你无需考虑&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TCP特点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;会将数据量比较小的并且时间间隔比较短的数据一次性打包发送给对方&lt;/p&gt;
&lt;p&gt;TCP是基于链接的，必须先启动服务端，然后再启动客户端去连接服务端&lt;/p&gt;</description>
    </item>
    <item>
      <title>【网络编程】OSI七层协议/TCP协议</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bosi%E4%B8%83%E5%B1%82%E5%8D%8F%E8%AE%AEtcp%E5%8D%8F%E8%AE%AE/</link>
      <pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Bosi%E4%B8%83%E5%B1%82%E5%8D%8F%E8%AE%AEtcp%E5%8D%8F%E8%AE%AE/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;网络编程.png&#34; loading=&#34;lazy&#34; src=&#34;https://zhong-er.com/assets/201908068133_5580_1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程(一) &amp;raquo;&amp;gt;&lt;/strong&gt;&lt;a href=&#34;https://mubu.com/doc/2o2v35H6G8&#34; title=&#34;思维导图&#34;&gt;&lt;strong&gt;思维导图&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;&amp;gt; &amp;raquo;&lt;/strong&gt;&lt;a href=&#34;https://www.cnblogs.com/renvip/p/11312188.html&#34; title=&#34;博客园&#34;&gt;&lt;strong&gt;博客园&lt;/strong&gt;****&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件开发架构&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C/S架构(clinet/server)：客户端/服务端&lt;/p&gt;
&lt;p&gt;B/S架构(browser/server)：浏览器/服务器&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;网络编程发展史&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;任何先进的技术最早都源于军事&lt;/p&gt;
&lt;p&gt;要想实现远程通信第一个需要具备的条件是：物理连接介质&lt;/p&gt;
&lt;p&gt;计算机之间要想实现远程通信除了有物理连接介质还需要一套公共标准/协议、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OSI七层协议&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用层&lt;/strong&gt;&lt;br&gt;
HTTP协议FTP协议&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;表示层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;会话层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;传输层&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TCP\UDP都是基于端口(port)工作的协议
计算机与计算机之间其实是计算机上的应用程序与应用程序之间的通信
端口:用来唯一标识一台计算机上的某个应用程序
端口号的范围:0~65535
注意:0~1024这些都是操作系统默认使用的端口号
建议:使用8000之后的端口
MySQL默认端口:3306
Redis默认端口:6379
django默认端口:8000
flask默认端口:5000	

端口号是动态分配的 第一次起qq分配到的是8989将qq关闭再次启动端口号可能就变了

总结
ip地址:用来唯一标识接入互联网的一台计算机
port端口:用来唯一标识一台计算机上的某个应用程序
ip+port:唯一标识接入互联网一台计算机上的某个应用程序
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;网络层&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IP协议规定了只要是接入互联网的计算机都必须有一个IP地址
ip地址特点:点分十进制
ip地址最小:0.0.0.0
ip地址最大:255.255.255.255
ip地址目前有两个版本:IPV4  IPV6(由于IPV4已经不够表示目前存在的计算机了 所以推出了IPV6版本)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;数据链路层&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1.规定的电信号的分组方式
2.规定了任何一台接入互联网的计算机都必须有一块网卡
每一块网卡上面都刻有世界上独一无二的编号
12位16进制数：前6位是厂商编号，后6位是流水线编号	
我们管这12数叫mac地址
ps:以上两点合称为&amp;quot;以太网协议&amp;quot;
交换机：基于以太网协议通信，不能跨局域网通信。
以太网协议通信的特点：通信基本靠吼！
                缺点：广播风暴
互联网是有N多个局域网彼此之间连接而成的。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;物理连接层&lt;/strong&gt;&lt;br&gt;
基于电信号传输010101001010二进制数据&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TCP协议(详见&lt;/strong&gt;&lt;a href=&#34;%7B#ZC_BLOG_HOST#%7Dpost/56.html&#34; title=&#34;TCP协议三次握手四次挥手&#34;&gt;&lt;strong&gt;《TCP协议三次握手四次挥手》&lt;/strong&gt;****&lt;/a&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;流式协议,可靠协议&lt;/p&gt;
&lt;p&gt;基于TCP协议通信 必先建立双向通道&lt;/p&gt;
&lt;p&gt;TCP协议传输数据可靠的原因在于它有反馈机制，发送消息之后对方必须回复确认收到消息才会将数据从内存中清空，否则在限定的时间时间内会每隔一段时间发送一次，如果超过限定时间还未收到，就会把对方计算机列为宕机或其他故障，停止向此计算机发送消息&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三次握手&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所谓三次握手(Three-way Handshake)，是指建立一个 TCP 连接时，需要客户端和服务器总共发送3个包。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;第一次客户端发送SYN包给服务端，客户端发送完毕进入SYN_SEND状态，
第二次服务端收到第一次客户端发送的SYN包后发回ACK确认包并同时也发送一个SYN包到客户端，服务端发送完毕进入SYN_RECV状态，
第三次客户端接收到服务端发送的ACK+SYN包后向服务端发回ACK确认包，发送完毕进入Established状态。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;四次挥手&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>【网络编程】TCP协议的三次握手四次挥手-详解</title>
      <link>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E7%9A%84%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B-%E8%AF%A6%E8%A7%A3/</link>
      <pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://zhong-er.com/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8Btcp%E5%8D%8F%E8%AE%AE%E7%9A%84%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B-%E8%AF%A6%E8%A7%A3/</guid>
      <description>&lt;h2 id=&#34;tcp-的特性&#34;&gt;TCP 的特性&lt;/h2&gt;
&lt;p&gt;TCP 提供一种面向连接的、可靠的字节流服务&lt;/p&gt;
&lt;p&gt;在一个 TCP 连接中，仅有两方进行彼此通信。广播和多播不能用于 TCP&lt;/p&gt;
&lt;p&gt;TCP 使用校验和，确认和重传机制来保证可靠传输&lt;/p&gt;
&lt;p&gt;TCP 给数据分节进行排序，并使用累积确认保证数据的顺序不变和非重复&lt;/p&gt;
&lt;p&gt;TCP 使用滑动窗口机制来实现流量控制，通过动态改变窗口的大小进行拥塞控制&lt;/p&gt;
&lt;p&gt;注意：TCP 并不能保证数据一定会被对方接收到，因为这是不可能的。TCP 能够做到的是，如果有可能，就把数据递送到接收方，否则就（通过放弃重传并且中断连接这一手段）通知用户。因此准确说 TCP 也不是 100% 可靠的协议，它所能提供的是数据的可靠递送或故障的可靠通知。&lt;/p&gt;
&lt;h2 id=&#34;三次握手与四次挥手&#34;&gt;三次握手与四次挥手&lt;/h2&gt;
&lt;p&gt;所谓三次握手(Three-way Handshake)，是指建立一个 TCP 连接时，需要客户端和服务器总共发送3个包。&lt;/p&gt;
&lt;p&gt;三次握手的目的是连接服务器指定端口，建立 TCP 连接，并同步连接双方的序列号和确认号，交换 TCP 窗口大小信息。在 socket 编程中，客户端执行 &lt;code&gt;connect()&lt;/code&gt; 时。将触发三次握手。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一次握手(SYN=1, seq=x):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;客户端发送一个 TCP 的 SYN 标志位置1的包，指明客户端打算连接的服务器的端口，以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。&lt;/p&gt;
&lt;p&gt;发送完毕后，客户端进入 &lt;code&gt;SYN_SEND&lt;/code&gt; 状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号，放到 Seq 域里，同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1，即X+1。 发送完毕后，服务器端进入 &lt;code&gt;SYN_RCVD&lt;/code&gt; 状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三次握手(ACK=1，ACKnum=y+1)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;客户端再次发送确认包(ACK)，SYN 标志位为0，ACK 标志位为1，并且把服务器发来 ACK 的序号字段+1，放在确定字段中发送给对方，并且在数据段放写ISN的+1&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
