zoukankan      html  css  js  c++  java
  • day27 网络通信协议 tcp/udp区别

    今日主要内容:

    一.网络通信协议

    二.tcp udp协议下的socket 

    一.网络通信协议

    1.1互联网的本质就是一系列的网络协议

    本机IP地址('127.0.0.1',xxxx)

    互联网连接的电脑互相通信的是电信号,

    互联网协议的功能: 定义计算机如何接入Internet ,以及接入Internet的计算机通信的标准.

    1.2 osi七层协议

    互联网协议按照功能不同分为osi七层或tcp/udp五层或tcp/ip四层

    socket 在五层通讯的应用层和传输层之间(又叫socket抽象层)

    socket又称为套接字,他是应用层与tcp/udp协议族通信的中间软件抽象层,他是一组接口.

    套接字socket的发展史及分类

      基于文件类型的套接字家族  套接字家族的名字: AF_UNIX

      Unix一切结尾文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一及其,可以通过访问同一个文件系统间接完成通信.

      基于网络类型的套接字家族  套接字家族的名字 :AF_INET

      (还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我们只使用AF_INET)

    TCP/UDP的区别(重点)

    1.TCP与UDP的对比

      TCP  可靠的 面向连接的协议,传输效率低全双工通信(发送缓存&接收缓存),面向字节流.

      使用TCP的应用: Web浏览器 ; 文件传输程序.

      UDP  不可靠的 无连接的服务,传输效率高,一对一 一对多 多对一 多对多 面向报文(数据包),尽最大努力服务,无拥塞控制.

      使用UDP的应用: 域名系统(DNS),视频流,IP语音包.

    由下图直接比较其中的差异

    TCP和UDP下socket差异对比图:

    上图只是让大家感受一下TCP和UDP协议,socket工作流程的不同,两者之间的差异是 TCP需要连接,

    而UDP不需要连接.

    二.tcp协议下的socket 

    上图就是通讯流程的大致描述

    socket绑定IP和端口时可能初选下面的问题:

    解决办法:

    #加入一条socket配置,重用ip和端口
    import socket
    from socket import SOL_SOCKET,SO_REUSEADDR
    sk = socket.socket()
    sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #在bind前加,允许地址重用
    sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
    sk.listen()          #监听链接
    conn,addr = sk.accept() #接受客户端链接
    ret = conn.recv(1024)   #接收客户端信息
    print(ret)              #打印客户端信息
    conn.send(b'hi')        #向客户端发送信息
    conn.close()       #关闭客户端套接字
    sk.close()        #关闭服务器套接字(可选)
    

    但是如果你加上了上面的代码之后出现了下面这个问题:  OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。如果出现了这个问题,只能换端口了,因为你的电脑不支持端口重用.

    注 : 用socket进行通信,必须是一收一发对应.

    2. TCP三次握手四次挥手(重点中的重点)

    三次握手流程:

    第一次握手(SYN=1, seq=x):
    
      客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。
    
      发送完毕后,客户端进入 SYN_SEND 状态。
    
    第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
    
      服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
    
    第三次握手(ACK=1,ACKnum=y+1)
    
      客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
    
    发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

    四次挥手流程:

    第一次挥手(FIN=1,seq=x)
    
        假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。
    
        发送完毕后,客户端进入 FIN_WAIT_1 状态。
    
    第二次挥手(ACK=1,ACKnum=x+1)
    
      服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。
    
      发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。
    
    第三次挥手(FIN=1,seq=y)
    
      服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。
    
      发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。
    
    第四次挥手(ACK=1,ACKnum=y+1)
    
      客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。
    
      服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。
    
      客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

    UDP协议下的socket

    TCP 与 UDP 的区别 : 一个需要连接,一个不需要连接,但是TCP连接传输的速度相比较UDP慢,但是安全性比UDP高.

  • 相关阅读:
    通用数据级权限控制解决方案的实现(二)(转)
    linux copy file to window
    日历 存储过程
    ssas 日期 时间维度表 sql 代码
    Dynamic CRM常用代码记录
    跨服务器查询sql (摘要)
    验证码实现
    office文档转pdf
    页面导出生成pdf,使用wkhtmltopdf第三方工具
    iTextSharp简单生成pdf和操作pdf添加水印
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/10217017.html
Copyright © 2011-2022 走看看