精华内容
下载资源
问答
  • 利用UDP传输数据

    2018-09-02 11:40:58
    发送端 public static void main(String[] args) throws Exception { 1.创建数据报包套接字 个Send()发送方法 DatagramSocket ds = new ... System.out.println(“UDP发送服务启动”); 2.准备数据 如果是系...

    发送端

    public static void main(String[] args) throws Exception {

    1.创建数据报包套接字 有个Send()发送方法
    DatagramSocket ds = new DatagramSocket();
    System.out.println(“UDP发送服务启动”);

    2.准备数据 如果是系统输入就是System.in 保存到数据包中
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str;
    while ((str = br.readLine())!=null) {
    byte[] buf =str.getBytes();

    3.创建数据报包 传入套接字中
    //数据包发送端需知晓接收方的IP地址也就是IP Name
    //IP地址对象
    *InetAddress address = InetAddress.getByName(“xxx.xxx.x.xxx”);
    //端口
    //唯一端口任意拟定
    DatagramPacket dp = new DatagramPacket (buf, buf.length,InetAddress.getByName(“xxx.xxx.x.xxx”), 8080);
    4.套接字调用Send()方法
    ds.send(dp);
    System.out.println(“发送完毕”);
    }
    ds.close();
    }

    接收端
    public static void main(String[] args) throws IOException {
    System.out.println(“UDP接受服务启动”);
    //创建一个数据报包套接字接收存储了字节数组的数据包 有一个receive()
    DatagramSocket ds = new DatagramSocket(5000);
    //创建一个存储的字节数组
    while (true) {
    byte[] buf = new byte[1024];
    //创建一个空的数据包将存储数据的字节数组存入数据包中通过套接字接收
    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    ds.receive(dp);
    InetAddress ip = dp.getAddress(); //获取发送者的IP地址
    System.out.println(ip + ” , 数据接收完成…”);
    // 解析数据,并显示在控制台
    // byte[] getData() : 获取数据缓冲区
    // int getLength() : 获取数据的实际长度
    System.out.println(new String(dp.getData(), 0, dp.getLength()));
    }
    }

    展开全文
  • UDP数据传输使用的方法

    千次阅读 2017-10-12 10:53:38
    memset函数使用详解 1.将已开辟内存空间 s 的首 n 个字节的值设为值 c。例: void *memset(void *s,int c,size_t n); 2.memset() 函数常用于内存空间初始化。例:char str[100]; memset(str,0,100); 3.memset...

    memset函数使用详解

    1.将已开辟内存空间 s 的首 n 个字节的值设为值 c。例: void *memset(void *s,int c,size_t n);

    2.memset() 函数常用于内存空间初始化。例:char str[100];    memset(str,0,100);

    3.memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));

    4.memset可以方便的清空一个结构类型的变量或数组。例:struct sample_struct TEST[10];memset(TEST,0,sizeof(struct sample_struct)*10);

    5.原型:extern void *memset(void *buffer, int c, int count);

    6.用法:#i nclude

    7.功能:把buffer所指内存区域的前count个字节设置成字符c。

    8.说明:返回指向buffer的指针。

    fgets函数的理解

    原型:char *fgets(char *buf, int n, FILE *fp)

    功能从文件流读取一行,送到缓存区,使用时注意以下几点:

    1.当遇到换行符或者缓存区已满,fgets就会停止,返回读到的数据,值得注意的是不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。


    2.每次调用fgets都会把缓存区的最后一个字符设为null,这意味着最后一个字符不能用来存放需要的数据,所以如果有一行,含有line_size个字符(包括换行符),想要把这行读入缓存区,请把参数n设为LINE_SIZE+1


    3.有结论1可推出:给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓存区总是以null字符结尾,对fgets的下一次调用会继续该行

    用法举例:
    读取一个文件并打印之

    1. FILE * fp = fopen(argv[1],"r");
    2. char buf[200];
    3. while (fgets(buf,200,fp) != NULL) {    /* 每行的字符不能超过199才能正常工作 */
    4.       printf("%s",buf);
    5. }

    sendto函数的理解

    简述: 向一指定目的地发送数据。

    #include <winsock.h>

      int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,
      const struct sockaddr FAR* to, int tolen);

      s:一个标识套接口的描述字。
      buf:包含待发送数据的缓冲区。
      len:buf缓冲区中数据的长度。
      flags:调用方式标志位。
      to:(可选)指针,指向目的套接口的地址。
      tolen:to所指地址的长度。

    注释:
      sendto()适用于已连接的数据报或流式套接口发送数据。对于数据报类套接口,必需注意发送数据长度不应超过通讯子网的IP包最大长度。IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。
      请注意成功地完成sendto()调用并不意味着数据传送到达。
      sendto()函数主要用于SOCK_DGRAM类型套接口向to参数指定端的套接口发送数据报。对于SOCK_STREAM类型套接口,to和tolen参数被忽略;这种情况下sendto()等价于send()。
      为了发送广播数据(仅适用于SOCK_DGRAM),in参数所含地址应该把特定的IP地址INADDR_BROADCAST(winsock.h中有定义)和终端地址结合起来构造。通常建议一个广播数据报的大小不要大到以致产生碎片,也就是说数据报的数据部分(包括头)不超过512字节。
      如果传送系统的缓冲区空间不够保存需传送的数据,除非套接口处于非阻塞I/O方式,否则sendto()将阻塞。对于非阻塞SOCK_STREAM类型的套接口,实际写的数据数目可能在1到所需大小之间,其值取决于本地和远端主机的缓冲区大小。可用select()调用来确定何时能够进一步发送数据。
      在相关套接口的选项之上,还可通过标志位flag来影响函数的执行方式。也就是说,本函数的语义既取决于套接口的选项也取决于标志位。后者由以下一些值组成:
    意义
    MSG_DONTROUTE   指明数据不选径。一个WINDOWS套接口供应商可以忽略此标志;参见2.4节中关于SO_DONTROUTE的讨论。
    MSG_OOB     发送带外数据(仅适用于SO_STREAM;参见2.2.3节)。  
    返回值:
      若无错误发生,send()返回所发送数据的总数(请注意这个数字可能小于len中所规定的大小)。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

    recvform函数的理解

    简述:   接收一个数据报并保存源地址。

    #include <winsock.h>

      int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags,
      struct sockaddr FAR* from, int FAR* fromlen);

      s:标识一个已连接套接口的描述字。
      buf:接收数据缓冲区。
      len:缓冲区长度。
      flags:调用操作方式。
      from:(可选)指针,指向装有源地址的缓冲区。
      fromlen:(可选)指针,指向from缓冲区长度值。

    注释:
      本函数由于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
      对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。如果套接口被设置为线内接收带外数据(选项为SO_OOBINLINE),且有带外数据未读入,则返回带外数据。应用程序可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。对于SOCK_STREAM类型套接口,忽略from和fromlen参数。
      对于数据报类套接口,队列中第一个数据报中的数据被解包,但最多不超过缓冲区的大小。如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函数返回WSAEMSGSIZE错误。
      若from非零,且套接口为SOCK_DGRAM类型,则发送数据源的地址被复制到相应的sockaddr结构中。fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。
      如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达。
      如果套接口为SOCK_STREAM类型,并且远端“优雅”地中止了连接,那么recvfrom()一个数据也不读取,立即返回。如果立即被强制中止,那么recv()将以WSAECONNRESET错误失败返回。
      在套接口的所设选项之上,还可用标志位flag来影响函数的执行方式。也就是说,本函数的语义既取决于套接口选项,也取决于标志位参数。标志位可取下列值:
      值 意义
      MSG_PEEK 查看当前数据。数据将被复制到缓冲区中,但并不从输入队列中删除。
      MSG_OOB 处理带外数据(参见2.2.3节具体讨论)。
      
    返回值:
      若无错误发生,recvfrom()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
    错误代码:
        WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
        WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
        WSAEFAULT:fromlen参数非法;from缓冲区大小无法装入端地址。
        WSAEINTR:阻塞进程被WSACancelBlockingCall()取消。
        WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
        WSAEINVAL:套接口未用bind()进行捆绑。
        WSAENOTCONN:套接口未连接(仅适用于SOCK_STREAM类型)。
        WSAENOTSOCK:描述字不是一个套接口。
        WSAEOPNOTSUPP:指定了MSG_OOB,但套接口不是SOCK_STREAM类型的。
        WSAESHUTDOWN:套接口已被关闭。当一个套接口以0或2的how参数调用shutdown()关闭后,无法再用recv()接收数据。
        WSAEWOULDBLOCK:套接口标识为非阻塞模式,但接收操作会产生阻塞。
        WSAEMSGSIZE:数据报太大无法全部装入缓冲区,故被剪切。
        WSAECONNABORTED:由于超时或其他原因,虚电路失效。
        WSAECONNRESET:远端强制中止了虚电路。

    展开全文
  • 由于UDP是面向无连接传输,所以接收端要先打开,再发送才能打印出来,否则数据会丢失哦!!!UDP发送端 package com.company; import java.net.*; public class Main { public static void main(String[] args) ...
    由于UDP是面向无连接传输,所以接收端要先打开,再发送才能打印出来,否则数据会丢失哦!!!
    UDP发送端
    
    package com.company;
    import java.net.*;
    public class Main {
        public static void main(String[] args) throws Exception{
            DatagramSocket ds=new DatagramSocket();//创建socket,建立端点
            byte[] buf="coming".getBytes();//确定数据,并封装成数据包
            DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("111.111.111.111"),10000);
            //DatagramPacket(byte[] buf,int length,InetAddress address,int port),构造数据报包,将长度为length的包发送到制定主机的指定端口。
            ds.send(dp);//通过socket服务,将数据包发送
            ds.close();//关闭资源
        }
    }

    UDP接收端
    
    
    package com.xbbudp;
    import java.net.*;
    public class Udprec {
        public static  void main(String args[]) throws Exception{
            DatagramSocket ds=new DatagramSocket(10000);//定义socket服务。
            byte [] buf=new byte[1024];//定义数据包,存储接收到的字节数据,因为数据包对象中有提取字节数据中的不同数据信息的功能。
            DatagramPacket dp=new DatagramPacket(buf,buf.length);
            //DatagramPacket(byte[] buf,int offset,int length),接受长度为length的包(1024全用),在缓冲区指定了偏移量
            ds.receive(dp);//将收到的数据存入数据包
            String ip=dp.getAddress().getHostAddress();//返回ip地址
            String data =new String(dp.getData(),0,dp.getLength());//接收到的数据为字节数组,所以要转换,1024没有装满,所以转换从0开始截取,到数据字符串末尾
            int port=dp.getPort();//端口
            System.out.println(ip+"  "+data+"  "+port);
            ds.close();//关闭资源
        }
    }
    展开全文
  • 传输层:UDP 协议一、传输层协议从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址。但是从传输层来看,是发送方主机的一个进程与接收方主机的一个进程在交换数据...

    传输层:UDP 协议

    一、传输层协议

    从之前介绍的网络层协议来看,通信的两端是两台主机,IP 数据报首部就标明了这两台主机的 IP 地址。但是从传输层来看,是发送方主机中的一个进程与接收方主机中的一个进程在交换数据,因此,严格地讲,通信双方不是主机,而是主机中的进程

    主机中常常有多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时运行),下图中,A 主机的 AP1 进程在于 B 主机的 AP3 进程通信,同时主机 A 的 AP2 进程也在与 B 主机的 AP4 进程通信。

    两个主机的传输层之间有一个灰色双向箭头,写着“传输层提供应用进程间的逻辑通信”。 逻辑通信:看起来是数据似乎是沿着双向箭头在传输层水平传输的,但实际上是沿图中的虚线经多个协议层次而传输。

    01

    TCP/IP 协议栈传输层有两个重要协议——UDP 和 TCP,不同的应用进程在传输层使用 TCP 或 UDP 之一:

    02


    二、端口

    在第一节我们已经了解过端口的概念,端口的作用体现在传输层。

    刚才的图中,AP1 与 AP3 的通信与 AP2 与 AP4 的通信可以使用同一个传输层协议来传输(TCP 或 UDP),根据 IP 地址或 MAC 地址都只能是把数据传到正确的主机,但具体需要传到哪一个进程,是通过端口来辨认的。比如同时使用浏览器和 QQ,浏览器占用 80 端口,而 QQ 占用 4000 端口,那么发送过来的 QQ 消息便会通过 4000 端口显示在 QQ 客户端,而不会错误地显示在浏览器上。

    端口号有 0~65535 的编号,其中:

    • 编号 0~1023 为 系统端口号 ,这些端口号可以在网址 www.iana.org 查询到,它们被指派给了 TCP/IP 最重要的一些应用程序,以下是一些常见的系统端口号:
    应用层协议:FTPTELNETSMTPDNSTFTPHTTPSNMP
    系统端口号:212325536980161
    • 编号 1024~49151 为 登记端口号 ,为没有系统端口号的应用程序使用,使用这类端口号必须在 IANA 按规定手续登记,以防止重复。

    • 编号 49152~65535 为 短暂端口号 ,是留给客户进程选择暂时使用的,使用结束后,这类端口号会被放开以供其它程序使用。

    三、UDP 概述

    UDP(User Datagram Protocol)用户数据报协议,它只在 IP 数据报服务之上增加了很少一点功能,它的主要特点有:

    • (1).UDP 是无连接的,发送数据之前不需要建立连接(而 TCP 需要),减少了开销和时延。

    • (2).UDP尽最大努力交付,不保证交付可靠性。

    • (3).UDP 是面向报文的,对于从网络层交付下来的 IP 数据报,只做很简单的封装(8 字节 UDP 报头),首部开销小。

    • (4).UDP 没有拥塞控制,出现网络拥塞时发送方也不会降低发送速率。这种特性对某些实时应用是很重要的,比如 IP 电话,视频会议等,它们允许拥塞时丢失一些数据,因为如果不抛弃这些数据,极可能造成时延的累积。

    • (5).UDP 支持一对一、一对多、多对一和多对多的交互通信。

    从应用层到传输层,再到网络层的各层次封装:

    03

    四、UDP 报文

    UDP 数据报可分为两部分:UDP 报头和数据部分。其中数据部分是应用层交付下来的数据。UDP 报头总共 8 字节,而这 8 字节又分为 4 个字段:

    04

    • (1)源端口 2 字节 在对方需要回信时可用,不需要时可以全 0;

    • (2)目的端口 2 字节 必须,也是最重要的字段;

    • (3)长度 2 字节 长度值包括报头和数据部分;

    • (4)校验和 2 字节 用于检验 UDP 数据报在传输过程中是否有出错,有错就丢弃。

    五、tcpdump 抓取 UDP 报文

    现在我们动手实践,尝试抓取一个 UDP 数据报,并解读其内容。

    我们需要一个小程序,用于向 指定 IP 地址 的 指定端口 发送一个 指定内容 的 UDP 数据报,这个程序已经编写好,依次输入以下命令,使用 github 把它下载下来,并编译:

    cd Desktop
    
    git clone http://git.shiyanlou.com/shiyanlou/tcp_ip_5
    
    cd tcp_ip_5
    
    gcc -o test test.c
    

    这个 C 程序会向 IP 地址 192.168.1.1 的 7777 端口 发送一条 "hello" 消息。你可以用编辑器修改程序,向不同的 IP 不同的 IP 发送不同的内容。

    编译完成后先别运行,我们还需要使用一个知名的抓包工具 tcpdump ,依次输入以下命令安装,并运行 tcpdump:

    sudo apt-get update
    sudo apt-get install tcpdump
    sudo tcpdump -vvv -X udp port 7777
    

    现在最小化当前终端,另开启一个终端,输入以下命令运行刚才编译好的 C 程序 test:

    cd Desktop/tcp_ip_5
    
    ./test
    

    test 程序运行结束,返回刚才运行 tcpdump 的终端查看抓包结果:

    05


    传输层:TCP 协议

    一、概述

    TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同。TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点:

    • (1) TCP 提供 可靠的 数据传输服务,TCP 是 面向连接的 。应用程序在使用 TCP 通信之前,先要建立连接,这是一个类似“打电话”的过程,通信结束后还要“挂电话”。

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

    • (3) TCP 提供可靠传输,无差错、不丢失、不重复、按顺序。

    • (4) TCP 提供 全双工 通信,允许通信双方任何时候都能发送数据,因为 TCP 连接的两端都设有发送缓存和接收缓存。

    • (5) TCP 面向 字节流 。TCP 并不知道所传输的数据的含义,仅把数据看作一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。

    01

    二、TCP 报文段结构

    TCP 是面向字节流的,而 TCP 传输数据的单元是 报文段 。一个 TCP 报文段可分为两部分:报头和数据部分。数据部分是上层应用交付的数据,而报头则是 TCP 功能的关键。

    TCP 报文段的报头有前 20 字节的固定部分,后面 4n 字节是根据需要而添加的字段。如图则是 TCP 报文段结构:

    02

    20 字节的固定部分,各字段功能说明:

    • 1.源端口和目的端口:各占 2 个字节,分别写入源端口号和目的端口号。这和 UDP 报头有类似之处,因为都是运输层协议。

    • 2.序号:占 4 字节序,序号范围[0,2^32-1],序号增加到 2^32-1 后,下个序号又回到 0。 TCP 是面向字节流的,通过 TCP 传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号

    • 3.确认序号:占 4 字节,期望收到对方下个报文段的第一个数据字节的序号。

    • 4.数据偏移:占 4 位,指 TCP 报文段的报头长度,包括固定的 20 字节和选项字段。

    • 5.保留:占 6 位,保留为今后使用,目前为 0。

    • 6.控制位:共有 6 个控制位,说明本报文的性质,意义如下:

      **URG 紧急**:当 URG=1 时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与**紧急指针**字段配合使用。
      **ACK 确认**:仅当 ACK=1 时**确认号**字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。
      **PSH 推送**:若 TCP 连接的一端希望另一端立即响应,PSH 字段便可以“催促”对方,不再等到缓存区填满才发送。
      **RET 复位**:若 TCP 连接出现严重差错,RST 置为 1,断开 TCP 连接,再重新建立连接。
      **SYN 同步**:用于建立和释放连接,稍后会详细介绍。
      **FIN 终止**:用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放 TCP 连接。
      
    • 7.窗口:占 2 个字节。窗口值是指发送者自己的接收窗口大小,因为接收缓存的空间有限。

    • 8.检验和:2 个字节。和 UDP 报文一样,有一个检验和,用于检查报文是否在传输过程中出差错。

    • 9.紧急指针:2 字节。当 URG=1 时才有效,指出本报文段紧急数据的字节数。

    • 10.选项:长度可变,最长可达 40 字节。具体的选项字段,需要时再做介绍。

    三、连接的建立与释放

    刚才说过,TCP 是面向连接的,在传输 TCP 报文段之前先要创建连接,发起连接的一方被称为客户端,而响应连接请求的一方被称为服务端,而这个创建连接的过程被称为三次握手 :

    03

    • (1) 客户端发出请求连接报文段,其中报头控制位 SYN=1,初始序号 seq=x。客户端进入 SYN-SENT(同步已发送)状态。

    • (2) 服务端收到请求报文段后,向客户端发送确认报文段。确认报文段的首部中 SYN=1,ACK=1,确认号是 ack=x+1,同时为自己选择一个初始序号 seq=y。服务端进入 SYN-RCVD(同步收到)状态。

    • (3) 客户端收到服务端的确认报文段后,还要给服务端发送一个确认报文段。这个报文段中 ACK=1,确认号 ack=y+1,而自己的序号 seq=x+1。这个报文段已经可以携带数据,如果不携带数据则不消耗序号,则下一个报文段序号仍为 seq=x+1

    至此 TCP 连接已经建立,客户端进入 ESTABLISHED(已建立连接)状态,当服务端收到确认后,也进入 ESTABLISHED 状态,它们之间便可以正式传输数据了。

    当传输数据结束后,通信双方都可以释放连接,这个释放连接过程被称为 释放连接 :

    04

    • (1) 此时 TCP 连接两端都还处于 ESTABLISHED 状态,客户端停止发送数据,并发出一个 FIN 报文段。首部 FIN=1,序号 seq=u(u 等于客户端传输数据最后一字节的序号加 1)。客户端进入 FIN-WAIT-1(终止等待 1)状态。

    • (2) 服务端回复确认报文段,确认号 ack=u+1,序号 seq=v(v 等于服务端传输数据最后一字节的序号加 1),服务端进入 CLOSE-WAIT(关闭等待)状态。现在 TCP 连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。

    • (3) 客户端收到确认报文,进入 FIN-WAIT-2 状态,服务端发送完数据后,发出 FIN 报文段,FIN=1,确认号 ack=u+1,然后进入 LAST-ACK(最后确认)状态。

    • (4) 客户端回复确认确认报文段,ACK=1,确认号 ack=w+1(w 为半开半闭状态时,收到的最后一个字节数据的编号) ,序号 seq=u+1,然后进入 TIME-WAIT(时间等待)状态。

    注意此时连接还没有释放,需要时间等待状态结束后(4 分钟) 连接两端才会 CLOSED。设置时间等待是因为,有可能最后一个确认报文丢失而需要重传。

    四、TCP 可靠传输的实现

    • (1) TCP 报文段的长度可变,根据收发双方的缓存状态、网络状态而调整。

    • (2) 当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。

    • (3) 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。这就是稍后介绍的超时重传

    • (4) TCP 将保持它首部和数据的检验和。如果通过检验和发现报文段有差错,这个报文段将被丢弃,等待超时重传。

    • (5) TCP 将数据按字节排序,报文段中有序号,以确保顺序的正确性。

    • (6) TCP 还能提供流量控制。TCP 连接的每一方都有收发缓存。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

    可见超时重发机制是 TCP 可靠性的关键,只要没有得到确认报文段,就重新发送数据报,直到收到对方的确认为止。

    五、超时重传

    TCP 规定,接收者收到数据报文段后,需回复一个确认报文段,以告知发送者数据已经收到。而发送者如果一段时间内(超时计时器)没有收到确认报文段,便重复发送:

    05

    为了实现超时间重传,需要注意:

    • 1.发送者发送一个报文段后,暂时保存该报文段的副本,为发生超时重传时使用,收到确认报文后删除该报文段。

    • 2.确认报文段也需要序号,才能明确是发出去的那个数据报得到了确认。

    • 3.超时计时器比传输往返时间略长,但具体值是不确定的,根据网络情况而变。

    六、连续 ARQ 协议

    也许你也发现了,按上面的介绍,超时重传机制很费时间,每发送一个数据报都要等待确认。

    在实际应用中的确不是这样的,真实情况是,采用了流水线传输:发送方可以连续发送多个报文段(连续发送的数据长度叫做窗口),而不必每发完一段就停下来等待确认。

    实际应用中,接收方也不必对收到的每个报文都做回复,而是采用累积确认方式:接收者收到多个连续的报文段后,只回复确认最后一个报文段,表示在这之前的数据都已收到。

    这样,传输效率得到了很大的提升。

    06

    七、流量控制和拥塞控制

    由于接收方缓存的限制,发送窗口不能大于接收方接收窗口。在报文段首部有一个字段就叫做窗口(rwnd),这便是用于告诉对方自己的接收窗口,可见窗口的大小是可以变化的。

    那么窗口的大小是如何变化的呢?TCP 对于拥塞的控制总结为“慢启动、加性增、乘性减”,如图所示:

    07

    • (1) 慢启动 :初始的窗口值很小,但是按指数规律渐渐增长,直到达到慢开始门限(ssthresh)

    • (2) 加性增 :窗口值达到慢开始门限后,每发送一个报文段,窗口值增加一个单位量。

    • (3) 乘性减 :无论什么阶段,只要出现超时,则把窗口值减小一半。

    八、tcpdump 抓取 TCP 报文段

    上一节实验,我们用 tcpdump 抓取并阅读了 UDP 报文,那么这次我们尝试抓取 TCP 报文段。当然首先要安装 tcpdump(安装方法参考上一节实验)。

    针对这次实验,需要下载从 github 下载代码,是基于 TCP 的聊天小程序,分为 server(服务端)和 client(客户端):

    cd Desktop
    
    git clone http://git.shiyanlou.com/shiyanlou/tcp_ip_6
    
    cd tcp_ip_6
    
    gcc -o server server.c
    
    gcc -o client client.c
    

    编译完成后先不要运行,先打开 tcpdump,使用命令安装并运行 tcpdump:

    sudo apt-get update
    sudo apt-get install tcpdump
    sudo tcpdump -vvv -X -i lo tcp port 7777
    

    最小化运行 tcpdump 的终端,然后另开一个终端,运行 server 程序:

    cd Desktop/tcp_ip_6
    
    ./server 127.0.0.1
    

    然后再打开第三个终端,运行 client 程序:

    cd Desktop/tcp_ip_6
    
    ./client 127.0.0.1
    

    现在,使用 client 和 server 聊天,轮流互发几条简短的消息(比如 hello、hi、wei 之类的)便可以关闭 client 和 server,回到运行 tcpdump 的终端查看抓取的报文段内容:

    08

    通过抓取的报文,还可以清晰的看到建立连接三次握手和断开连接四次握手的过程。


    展开全文
  • 本文章主要讲述使用 VS2019 编写 C# 程序 实验环境: Window 10 系统 开发工具: Visual Studio 2019 一、控制台程序发送 本部分内容: 用 C# 编写一个命令行/控制台 hello world 程序,实现如下功能:在屏幕上...
  • 使用UDP的情况

    2012-11-26 19:22:55
    UDP首部只有8个字节长。 1 性能比完整性更为重要的数据。...例如,如果一个应用程序需要多播或广播数据,则它必须使用UDP,因为TCP仅支持两个设备之间的单播通信。 要点:在下列两种情况下
  • UDP用户数据报协议和IP分组

    千次阅读 2014-06-04 14:11:22
    当IP层根据协议字段把UDP报文向上传送到UDP模块后,UDP模块再根据端口号将数据发送到相应的进程,以此实现进程到进程间的通信。 16位UDP长度代表UDP首部和UDP数据的总字节数。长度最小可以为8,即数据段不...
  • 传输层是负责数据能够从发送端传输接收端。负责端与端之间的传输。 端口号是唯一表示
  • 【网络编程】UDP数据报格式

    千次阅读 2017-10-19 22:45:44
    UDP数据报格式   UDP数据段 下面分析一帧基于UDP的TFTP协议帧。 以太网首部 0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00 IP首部 0000: 45 00 0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8 0020: ...
  • 在TCP/IP网络体系结构,TCP(传输控制协议,Transport Controll Protocol、UDP(用户数据报协议,User Data Protocol)是传输层最重要的两种协议,为上层用户提供级别的通信可靠性。 传输层的功能 传输层的主要...
  • TCP如何保证可靠数据传输

    千次阅读 2017-03-17 09:58:46
    在一个TCP连接,仅两方进行彼此通信。广播和多播不能用于TCP。 TCP通过下列方式来提供可靠性: 1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。
  • TCP/IP是普遍使用的网络互连标准协议,可在不同环境和不同节点之间进行彼此通信,是连入Internet的所有计算机在网络上进行各种信息交换和传输所必须采用的协议,也是Windows NT、Windows 2000 Server、NetWare及UNIX...
  • 在Java中使用WebRTC传输视频

    千次阅读 2020-06-09 14:34:56
    引言 最近一段时间的主要工作内容是开发一个远程控制手机的功能,其中音视频传输的部分是采用WebRTC技术...这篇文章,我就来分享一下我是怎么在Java中使用WebRTC的,以及我根据业务需要对WebRTC的一些改动。 说实话,
  • TCP /IP 协议-(传输层)UDP协议

    千次阅读 2016-07-03 15:06:46
    但是从传输层来看,是发送方主机的一个进程与接收方主机的一个进程在交换数据,因此,严格地讲,通信双方不是主机,而是主机的进程。主机常常多个应用进程同时在与外部通信(比如你的浏览器和 QQ 在同时...
  • 1、概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层... 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包...
  • UDP协议

    2009-03-06 15:35:00
    UDP协议简介UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。...
  • 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。...TCP或UDP中数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}} -----------------------------------------
  • TCP的可靠体现在TCP在传输数据之前,会三次握手来建立连接,而且在数据传递时,确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开连接用来节约系统资源 缺点:慢,效率低,占用系统资源高,易被攻击 ...
  • TCP、UDP数据包大小的限制

    万次阅读 多人点赞 2016-05-29 10:27:34
    1、概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层...TCP或UDP中数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}} 不同的协议层对数据包不同的称谓,在传输层叫做段(se
  • 原创性声明 ...本文介绍 UdpClient 类在同步阻塞模式中为发送和接收无连接的 UDP 数据包而提供了...因为 UDP 是一种无连接的传输协议,所以你不需要在发送和接收数据之前建立任何远程主机连接。你只需要按照下列方式来建立
  • UDP-Connect

    2017-03-10 16:17:26
    我们也知道UDP是面向无连接的,它传输数据之前是不需要建立连接的,那么对于UDP通信编程,我们是否需要调用connect了?如果可以,什么时候调用了?调用了什么好处了? 一、发送接收函数 首先回顾下,传输数据...
  • 传输

    2017-03-11 22:06:26
    传输层的主要功能是:分割并重新组装上层提供的数据流,为数据流提供端到端的传输服务传输层的两大协议:TCP(传输控制协议)UDP(用户数据包协议)。一:数据分段 从图片可以看出,传输层将数据划分为多个...
  • tcp协议和udp协议的使用场景

    千次阅读 2018-09-09 12:15:03
    一:什么是TCP(Transmission Control Protocol,传输控制协议) tcp是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,...
  • 【LwIP - UDP】- 实现UDP通信

    千次阅读 2018-09-10 14:47:24
    目录   基于LwIP实现UDP通信 ...UDP,即用户数据包协议,属于TCP/IP 传输层。同样,TCP,即传输控制协议,也是属于TCP/IP传输层。这两者区别在此处不加以解释,本文主要讲解如何通过LwI...
  • UDP广播,UDP多播

    千次阅读 2017-05-10 11:21:25
     使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文并且发送出去。至于服务器端是否存在,或者...
  • 树莓派开机自动采集并传输数据

    千次阅读 2017-04-05 16:11:37
    1、(1)先安装好驱动(一般是.ko...(2)通过insmod命令启动驱动,如在文件/etc/local添加下列行: sudo insmod /home/pi/8821au.ko 2、设置wlan1连接到的网络 参考:https://i.cmgine.net/archives/11053.html ...
  • JAVA面向网络编程,了解TCP,UDP协议什么是TCP协议什么是UDP通信协议使用场景 什么是TCP协议 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的...
  • 在一个TCP连接,仅两方进行彼此通信。广播和多播不能用于TCP。 TCP通过下列方式来提供可靠性和顺序性: 1、应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,489
精华内容 6,595
关键字:

下列服务中使用udp传输数据的有