美文网首页PythonPython
Python学习——TCP协议、端口学习

Python学习——TCP协议、端口学习

作者: 阿猫阿狗py | 来源:发表于2018-08-14 22:02 被阅读302次

    1.TCP协议的处理方式[传输控制协议,特点,特性,使用场景]

    TCP:Transmission Control Protocol传输控制协议,TCP是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。

    ·TCP是因特网中的传输层协议,使用三次握手协议建立连接、四次挥手断开连接

    ··三次握手

    1.PNG

    seq是序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是等待接收的数据包的序列号。SYN:同步序列编号(Synchronize Sequence Numbers)。

    第一次握手:建立连接时,客户端发送syn包(syn=1)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

    第二次

    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=1),即SYN+ACK包,此时服务器进入SYN_RECV状态;

    第三次

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。


    捕获.PNG

    特点:(1)TCP是面向连接的传输层协议,应用程序在使用TCP之前,必须先建立TCP传输连接

    (2)每一条TCP连接只能有两个端点,TCP连接只能是点对点的

    (3)TCP提供可靠交付的服务

    (4)TCP提供全双工通信

    (5)面向字节流,TCP不像UDP那样一个个保温独立的传输,而是在不保留报文边界的情况下以字节流方式传输。

    使用场景:在对网络通信质量要求较高时,需要使用TCP协议进行通信。

    2.什么是网络?

    计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

    3.什么是IP?

    网络之间互连的协议(IP)是Internet Protocol,所谓IP地址就是给每个连接在互联网上的主机分配的一个32位地址。网络互联协议就是为了多台计算机能够在网络中互联通信而设计的协议,是能够使得网络上工作的任意一台计算机可以和其他计算机之间实现网络通信的一套通用规则,任何计算机制造商生产的计算机必须遵循这套规则的情况下,就可以接入现行的网络实现联网通信的功能。

    2.PNG

    A类地址

    (1)A类地址第1字节为网络地址,其它3个字节为主机地址。它的第1个字节的第一位固定为0.

    (2)A类地址网络号范围:1.0.0.0---126.0.0.0

    (3)A类地址中的私有地址和保留地址:

    ① 10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。

    范围(10.0.0.0---10.255.255.255)

    ② 127.X.X.X是保留地址,用做循环测试用的。

    B类地址

    (1) B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。它的第1个字节的前两位固定为10.

    (2) B类地址网络号范围:128.0.0.0---191.255.0.0。

    (3) B类地址的私有地址和保留地址

    ① 172.16.0.0---172.31.255.255是私有地址

    ② 169.254.X.X是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IP。

    191.255.255.255是广播地址,不能分配。

    C类地址

    (1)C类地址第1字节、第2字节和第3个字节为网络地址,第4个字节为主机地址。另外第1个字节的前三位固定为110。

    (2)C类地址网络号范围:192.0.0.0---223.255.255.0。

    (3) C类地址中的私有地址:

    192.168.X.X是私有地址。(192.168.0.0---192.168.255.255)

    D类地址

    (1) D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110。

    (2) D类地址范围:224.0.0.0---239.255.255.255

    E类地址

    (1) E类地址不分网络地址和主机地址,它的第1个字节的前五位固定为11110。

    (2) E类地址范围:240.0.0.0---255.255.255.254

    4.端口

    计算机端口(port),是计算机与外界通信的接口。

    TCP/IP协议中的端口,端口号的范围为0~65536。

    端口号根据其使用场景,一般区分为公用端口、动态端口、保留端口

    公用端口:0~1023

    动态端口:1024-65536

    保留端口:一般是unix系统中超级用户进程分配保留端口号


    3.PNG

    5.协议

    协议(protocal),是多方协商计议之后得出的约定、规范、规则

    通常情况下为了让工作在网络中的多台计算机之间能有好的完成不同软件的数据的通信,出现了互联网数据传输协议的概念,通过协议的约束,不同地域环境的计算机可以通过网络完成流畅的数据交互。

    OSI/RM模型

    4.PNG

    应用层:提供应用程序之间的通信

    表示层:梳理数据格式、数据加密

    会话层:建立、维护、管理会话

    传输层:建立主机端到端连接

    网络层:寻址和路由选择

    数据链路层:提供介质访问、链路管理等

    物理层:比特流二进制传输

    网络编程:重点
    1.网络概述、IP地址、PORT端口

    ·网络概述:由若干结点和连接这些结点的链路组成。
    将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
    ·IP地址:
    网络之间互连的协议(IP)Internet Protocol,是为计算机网络相互连接进行通信而设计的协议。IP地址具有唯一性,根据用户性质的不同,可以分为5类。

    2.网络协议、OSI/RM模型、协议族

    ·网络协议:协议(protocal),是多方协商计议之后得出的约定、规范、规则
    通常情况下为了让工作在网络中的多台计算机之间能有好的完成不同软件的数据的通信,出现了互联网数据传输协议的概念,通过协议的约束,不同地域环境的计算机可以通过网络完成流畅的数据交互。
    ·ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI
    ·协议族:

    3.TCP协议、UDP协议

    TCP协议:Transmission Control Protocol传输控制协议,TCP是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。
    UDP协议:UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。

    4.python TCP/UDP编程

    Python TCP编程:

    服务端

    定义服务器地址信息
    创建SOCK_STREAM类型的套接字对象
    bind服务器并listen端口
    accept等待客户端的接入
    接入之后的send/recv数据交互
    服务器要关闭的情况下close关闭套接字释放资源

    '''TCP服务端'''
    #导入需要的模块
    import socket
    
    #定义数据
    HOST = ''
    PORT = 8080
    ADDRESS = (HOST,PORT)
    
    #定义数据读写缓冲字节大小
    BUFFER = 1024
    
    #建立一个套接字对象
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #绑定主机
    tcp_socket.bind(ADDRESS)
    
    #监听
    tcp_socket.listen(5)
    
    #循环
    while True:
        print("等待连接···")
        socket_server, addr = tcp_socket.accept()
        print("连接成功···",addr)
    
        while True:
    
            info = input("请输入消息:")
            socket_server.send(info.encode('utf-8'))
    
            msg = socket_server.recv(BUFFER)
            print("接受的信息为:",msg.decode('utf-8'))
            if msg == 'BYE':
                socket_server.close()
                break
    
    
    客户端:

    定义主机数据
    定义接收数据缓存大小
    定义一个套接字对象
    连接主机
    收发消息

    '''TCP客户端'''
    import socket
    
    #定义主机数据
    TARGET_HOST = '192.168.45.1' #自己的ip地址
    TARGET_PORT = 8080
    ADDRESS = (TARGET_HOST,TARGET_PORT)
    #定义接收数据缓存大小
    BUFFER = 1024
    
    #定义一个套接字对象
    tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #连接主机
    tcp_client.connect(ADDRESS)
    
    while True:
        msg = tcp_client.recv(BUFFER)
        print("收到的信息为:",msg.decode('utf-8'))
    
        info = input("请输入要发送的信息:")
        tcp_client.send(info.encode('utf-8'))
    
        if info == 'BYE':
            tcp_client.close()
            break
    print("退出客户端")
    
    PythonUDP编程:服务端:

    定义服务器地址信息
    定义数据缓存大小
    创建套接字对象
    等待连接,接连后收发消息

    '''UDP服务端'''
    #导入依赖的模块
    import socket
    
    #定义数据
    HOST = ''
    PORT = 8081
    ADDRESS = (HOST,PORT)
    BUFFER = 1024
    
    #创建一个udp套接字对象
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    #绑定主机
    udp_socket.bind(ADDRESS)
    print('等待连接')
    
    while True:
        #接收消息
        msg,addr = udp_socket.recvfrom(BUFFER)
        try:
            print(addr,"发送的消息为:",msg.decode("utf-8"))
        except:
            print(addr,"发送的消息为:" ,msg.decode("gbk"))
    
        #发送消息
        info = input("《服务器》请输入消息:")
        udp_socket.sendto(info.encode('utf-8'),addr)
    
        if info == 'BYE':
            udp_socket.close()
            break
    

    客户端:
    定义主机地址
    定义数据缓存大小
    发送消息(发送消息时要加上地址,目标主机的地址)

    '''udp客户端'''
    import socket
    
    TARGET_HOST = '192.168.13.61' #自己的ip地址
    TARGET_PORT = 8081
    ADDRESS = (TARGET_HOST,TARGET_PORT)
    BUFFER = 1024
    
    #在客户端创建一个udp套接字对象
    udp_client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    while True:
    
        # 发送消息
        info = input('<客户端>请输入消息:')
        udp_client.sendto(info.encode('utf-8'),ADDRESS)
    
        if info == 'BYE':
            udp_client.close()
            break
    
        #接收消息
        msg,addr = udp_client.recvfrom(BUFFER)
        print(addr,"从服务端接收到的消息为:",msg.decode('utf-8'))
    
    
    

    相关文章

      网友评论

      • Oo莫莫oO:抄了这么多,提供一下完整的tcp server端解决粘包,分包的python代码。体现一下开源精神。

      本文标题:Python学习——TCP协议、端口学习

      本文链接:https://www.haomeiwen.com/subject/maybbftx.html