zoukankan      html  css  js  c++  java
  • 28_网络编程-TCP/UDP

    一、传输层
     
        1、定义
     
        IP首部有一个协议字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议。根据这个字段的协议号,就可以识别IP传输的数据部分究竟是TCP的内容还是UDP的内容。
        同样,传输层的TCP( 6 )和UDP( 17 ),为了识别自己所传输的数据部分究竟应该发给哪个应用,也设定了这样一个编号。
        在TCP/IP通信中需要指定“应用程序”。而传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码。根据端口号可以识别在传输层上一层的应用层中所要进行处理的具体程序。
     
        2、TCP/UDP
     
        传输协议TCP、UDP通过接收数据中的目标端口识别目标处理程序。以下图为例,传输协议的数据将被传递给HTTP、TELNET以及FTP等应用层协议
     
        (1) TCP
     
        TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管道中的水流。TCP为提供可靠性传输,实行“顺序控制”或“重传控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
     
        (2) UDP
     
        UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。UDP情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。传输速度快
     
        (3) TCP/UDP应用场景
     
        UDP - User Datagram Protocol的缩写
     
            UDP不提供复杂控制机制,利用IP提供面向无连接的通信服务。且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。
            UDP面向无连接,可以随时发送数据。它常用于几个方面:
                                    <1>包总量较少的通信(DNS、SNMP等)
                                    <2>视频、音频等多媒体通信(即时通信)
                                    <3>限定于LAN等特定网络中的应用通信
                                    <4>广播通信(广播、多播)
     
            TCP - TCP充分实现了数据传输时各种控制功能,根据TCP这些机制,在IP这种无连接的网络上也能够实现高可靠性的通信
     
    二、socket - 应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
     
        使用TCP或UDP通信时,会广泛使用到套接字(socket)的API。套接字原本是由BSD UNIX开发的,但是后被移植到Windows以及嵌入式操作系统中。应用程序利用套接字,可以设置对端的IP地址、端口号,并实现数据的发送和接收。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。知名端口号(0-1023)随机(49152-65535)
        1、UDP编写socket
     
        服务端
    1 import socket
    2 udp_sk = socket.socket(type=socket.SOCK_DGRAM)   #创建一个服务器的套接字
    3 udp_sk.bind(('127.0.0.1',9000))        #绑定服务器套接字
    4 msg,addr = udp_sk.recvfrom(1024)
    5 print(msg)
    6 udp_sk.sendto(b'hi',addr)                 # 对话(接收与发送)
    7 udp_sk.close()                         # 关闭服务器套接字

        客户端

    1 import socket
    2 ip_port=('127.0.0.1',9000)
    3 udp_sk=socket.socket(type=socket.SOCK_DGRAM)
    4 udp_sk.sendto(b'hello',ip_port)
    5 back_msg,addr=udp_sk.recvfrom(1024)
    6 print(back_msg.decode('utf-8'),addr)
    总结:
         1、TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。 即面向流的通信是无消息保护边界的。
        2、UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法,, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。  即面向消息的通信是有消息保护边界的。
        3、tcp是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住,而udp是基于数据报的,即便是你输入的是空内容(直接回车),那也不是空消息,udp协议会帮你封装上消息头,实验略
        4、udp的recvfrom是阻塞的,一个recvfrom(x)必须对唯一一个sendinto(y),收完了x个字节的数据就算完成,若是y>x数据就丢失,这意味着udp根本不会粘包,但是会丢数据,不可靠
        5、tcp的协议数据不会丢,没有收完包,下次接收,会继续上次继续接收,己端总是在收到ack时才会清除缓冲区内容。数据是可靠的,但是会粘包。
  • 相关阅读:
    线程笔记
    值类型与引用类型
    abstract抽象 抽象方法 不能有实现{} 0907
    接口
    结构
    XML初探
    javaScript中为什么会有变量提升?
    Windows 7实现自动登录(本地账户和域账户)
    WCF 提示 "由于正在读取的 XML 数据的嵌套级比配额所允许的多,因此已超出最大读取深度 (32)" 的解决办法
    也来安个家!
  • 原文地址:https://www.cnblogs.com/hq82/p/9846224.html
Copyright © 2011-2022 走看看