TCP和UDP

发布时间 2023-03-26 16:52:52作者: ZqurGy

1.TCP和UDP的形象举例

TCP

例子:饭店的门口有一个迎宾人员,这时莫个人X去吃饭,被迎宾人员接待交给服务员服务员为这个X提供各种服务

  • X -》某个客户端
  • 迎宾人员 -》listen的端口
  • 服务人员 -》accept接受后的端口
  • sever端

    // 迎宾人员 -- client -》为迎宾人员确定服务地点,并告诉她进行迎宾,可以有多个迎宾人员
    fd = socket();
    bind(ip,port);
    listen(); -》listen的过程是被动的,c/s的三次握手也是发生再次,确认连接之后,进入accept过程;
    -- listen的过程不会影响后续的操作,或者说它是非阻塞的
    
    // 服务员 -- client -》进行各种服务,结账close亦如此
    client = accept();
    recv(client);
    send(client);
    close();
    
  • client端

    // 吃饭的人
    fd = socket();
    bind(); -》optional可选项;
    addr;-》准备吃饭的地址;
    connect(addr);
    send();
    recv();
    close();
    

UDP

例子:UDP和TCP的不同就是,UDP的饭店是个小饭店,迎宾的人和服务的人是同一个人 -》这就代表了UDP服务器只有一个端口进行工作

  • sever端

    fd = socket();
    recvfrom(fd, addr, buffer, length, 0);-》接受信息的时候,会把client的地址传出来,对于一个客户端来说
    sendto();
    
  • client端

    fd = socket();
    recvfrom(fd, addr, buffer, length, 0);
    sendto();
    
  • 如果想要使用UDP服务器进行多个客户端的并发,应该怎么办?

    • 模拟TCP通信,创建一个fd,服务client
      • 可以在应用层和传输层UDP之间增加一个协议,保证并发连接
    • 为什么使用增加协议头不行呢?
      • 这种方法有个前提:先发先到,具有顺序
      • 不可以,在公网下,数据链路层是把数据进行分组发出,中间经历多次路由,并且UDP是不会对数据的连接负责,即不能保证数据的接收是顺序的,因此对于多个客户端对应一个端口,所有数据是无序的,也就找不到其协议头 -》也就无法从应用层上确定发过来的数据是谁的;

socket的理解

  • socket = fd + (sip、dip、sport、dport、tcp/udp)即文件描述符+网络配套资源(五元组)的一套插座组合
    • 可以看作一个客户端
    • 具有IO的某些属性

2.拓展

  • select/ poll/ epoll
  • sigio