zoukankan      html  css  js  c++  java
  • 传输模型,网络层次划分,三次握手,四次挥手,IP与端口,套接字socket

    了解套接字之前,需要先了解基本的传输模型

    其次,还需要了解网络的七层划分和四层结构

    在python中,数据链路层相当于硬件层,python不需要了解,只用在传输层进行学习就足够了

    其中,传输层分为TCP传输协议和UDP协议,TCP协议相当于打电话,是可靠传输,但是UDP的传输是不可靠的,就像发短信,

    当短信发出,可能会出现时间的混乱,可能会出现发送失败的情况,是不可靠的。

    需要提前明白的是:

      作为python开发,都是在应用层的HTTP之上进行开发的,而HTTP协议是基于TCP协议之上的

      python网络编程,其最底层,就在传输层,再往下,python是做不了的


    还需要了解的,关于TCP的连接

      建立连接(三次握手)

      数据传输

      断开连接(四次挥手)

    1. 建立连接(三次握手)

    客户端向服务器发起请求连接的包(一次),当服务器接收的请求,就会返回一个同意连接的包(第二次),

    在客户端就会建立连接,然后向服务器发送已经建立连接的信息(三次),服务器收到客户端成功连接的信息,

    就会正式开始连接

    第三次是为了确认,假设如果客户端网络不好,第一次请求由于网络延时,由于长时间的等待

    客户发起了第二次请求,完成了三次握手后,第一次请求连接的包发送到了服务器,服务器向客户端发起同意连接,

    但是并没有收到客户端的成功连接信息,服务器就不会建立连接,从而达到网资源的不浪费】

    2. 数据传输

    数据的传输,客户端发起请求,服务器发起响应,完全按照一发一收,一收一发

    3.断开连接(四次挥手)

    客户端向服务器发起完成(出动关闭)请求(第一次),服务器收到请求返回同意请求(第二次),但此时并没有完全关闭,还会有一段等待的时间,

    服务器会在会这短时间将未传输完成的数据传输完毕,当完成全部传输,就会向客户端发起关闭请求(第三次),客户端收到以后,会返回确认信息(第四次),

    这时服务器就会关闭,客户端会也会等待一段时间,然后关闭。

    【第四次还是为了确认】


    通信定位的流程

    1. 先找IP

    IP地址确定用户,127.0.0.1表示本地IP,0.0.0.0表示任意访问    最大到255.255.255.255

    2. 再找端口

    端口从0到65535,0~1023都是一些专有特殊端口,不能使用。1024~65535之间的是动态端口,可以随意使用(也有特殊的)。

    其中,一些特殊的,比如80表示HTTP,22表示ssh,21FTP,3306表示Mysql,6379表示redis,27017表示MongoDB


     最后学会使用套接字socket创建服务器和客服端

    创建一个服务器端口

     1 import socket
     2 server = socket.socket()
     3 server.bind(("", 9999))    # 元组
     4 server.listen(3)    # python3.6以后才支持的监听最大量操作
     5 conn,addr = server.accept() # 取conn建立对等连接
     6 while True:
     7     data = conn.recv(1024)
     8     if not data:
     9         break
    10     print(data.decode())
    11     conn.send(data)    #原数据返回
    12 conn.close()
    13 server.close()    #关闭

    建立一个客户端:

    import socket
    client = socket.socket()
    client.connect(('127.0.0.1', 9999))    #本地IP
    while True:
        data = bytes(input('>>>'), encoding='utf-8')
        if not data:
            break
        client.send(data)    # 发送消息
        re_data = client.recv(1024)
        print('回执消息:', re_data)
    client.close()

    先运行服务器,再运行客户端,就可以向服务器发送信息,并接收到服务器回执的相同的消息

  • 相关阅读:
    PS 色调——颜色运算
    [ExtJS5学习笔记]第二十二节 Extjs5中使用beforeLabelTpl配置给标签增加必填选项星号标志
    [ExtJS5学习笔记]第二十一节 Extjs5中使用config配置给ext.widget或者create方法传递参数
    PS 滤镜——素描算法(一)
    [ExtJS5学习笔记]第二十节 Extjs5配合数组的push方法,动态创建并加载组件
    [ExtJS5学习笔记]第十九节 Extjs5中通过设置form.Panel的FieldSet集合属性控制多个field集合
    【翻译】Ext JS最新技巧——2014-9-10
    Ext JS 5的声明式事件监听
    BZOJ_3477_[Usaco2014 Mar]Sabotage_二分答案
    BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序
  • 原文地址:https://www.cnblogs.com/pywjh/p/9450778.html
Copyright © 2011-2022 走看看