• OSI七层网络模型&TCP&UDP&三握四挥


    网络七层
    网络七层图形

     

    OSI七层协议

    OSI各层详解

    物理层:
    在连接各种计算机的传输媒体上传输数据比特流 (将我们发送的数据转换成二进制比特流传输)
    数据链路层:
    将比特流组合成字节进而组合成帧,使用用MAC地址寻址 (我们所说的二层交换机就工作在这一层)
    网络层:
    使用ip地址寻址,实现不同网络之间的路径选择。 (我们所说的路由求就工作在这一层)
    传输层:
    传输层定义了主机与应用程序之间端到端的连通性,是源端到目的端对数据传送进行控制从低到高的最后一层。
    会话层:
    建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
    表示层:
    数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
    应用层:
    网络服务与最终用户的一个接口。
    TCP三次握手
    三次握手

    ####1、第一次握手
    # 建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号seq=x,并进入SYN_SENT状态,等待服务器确认。

    ####2、第二次握手
    # 服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。

    ####3、第三次握手
    # 客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发送完毕,
    # 客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。

    四次挥手

    #### 1、第一次挥手
    # 首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。

    #### 2、第二次挥手
    # 服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一。

    #### 3、第三次挥手
    # 关闭服务器到客户端的连接,发送一个FIN给客户端。

    #### 4、第四次挥手
    # 客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。
    # 首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
    三次挥手,四次握手的示例图


    TCP与UDP比较
    TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
    TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,即不保证可靠交付
    Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。
    UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
    每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
    TCP对系统资源要求较多,UDP对系统资源要求较少。
    注:UDP一般用于即时通信(QQ聊天 对数据准确性和丢包要求比较低,但速度必须快),在线视频等
    TCP/UDP相关协议
    TCP: STMP, TELNET, HTTP, FTP
    UDP: DNS,TFTP,RIP,DHCP,SNMP

    """udp套接字对话"""
    import socket
    #创建udp套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #绑定端口(接受端口9090)
    udp_socket.bind(("",9090))
    #要发送的数据
    udp_msg=input("--|:")
    #编码(encode转换成计算机能识别的语言)sa
    udp_mmsg = udp_msg.encode("gbk")
    #发送数据udp_mmsg到192.168.1.118机8080端口
    udp_socket.sendto(udp_mmsg,("192.168.1.118",8080))
    #接收数据(数据和ip地址)
    recv_date,ip_port=udp_socket.recvfrom(1024)
    #解码(转换成人能识别的语言)
    recv_content = recv_date.decode("gbk")
    #输出
    print("--|:",recv_content,ip_port)
    #关闭套接字
    udp_socket.close()
    """tcp客户端套接字"""
    import socket
    #创建tcp套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #建立连接
    tcp_socket.connect(("192.168.1.118",8080))
    while True:
    #要发送的数据
        tcp_msg = input("--|:")
    #数据转换
        tcp_masg = tcp_msg.encode("gbk")
    #发送数据
        tcp_socket.send(tcp_masg)
    #接收数据
        recv_date=tcp_socket.recv(1024)
    #解码
        recv_data = recv_date.decode("gbk")
    #输出
        print("--|:",recv_data)
    #关闭套接字
        tcp_socket.close()
    """tcp服务端套接字"""
    import socket
    #创建服务端套接字
    tcp_server_socket = socket.socket()
    #绑定
    tcp_server_socket.bind(("",8080))
    #设置监听
    tcp_server_socket.listen(128)
    #等待客户端连接
    tcp_client_socket,ip_port = tcp_server_socket.accept()#(信息 地址)
    #接受客户端请求
    recv_date = tcp_client_socket.recv(4096)
    recv_msg = recv_date.decode("gbk")
    print("接收到的数据为%s,来自%s"%(recv_msg,ip_port))
    #处理请求,给出响应
    tcp_client_socket.send("您的请求已查收,正在处理...".encode("gbk"))
    #关闭
    tcp_client_socket.close()
    tcp_server_socket.close()
  • 相关阅读:
    【EFCORE笔记】自动生成属性的显式值
    【EFCORE笔记】更新数据的多种方案
    【EFCORE笔记】添加数据的多种方案
    【EFCORE笔记】多租户系统的最佳实践
    【EFCORE笔记】全局查询筛选器
    【EFCORE笔记】异步查询&工作原理&注释标记
    【EFCORE笔记】执行原始SQL查询
    003_Redis后台启动(windows10与)
    Office 2010后 如何保存新的样式集
    Mysql启动 发生系统错误 1067
  • 原文地址:https://www.cnblogs.com/errenjune/p/12513353.html
Copyright © 2020-2023  润新知