【网络通信】TCP和UDP [一]

来源:互联网 发布:java中审批流程怎么写 编辑:程序博客网 时间:2024/06/16 21:38

要搞清楚网络中进程间是如何通信的,首先就得解决“如何标志一个进程”,网络层的“IP地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(IP地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。

TCP和UDP

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网间协议),主要目的是提供与底层硬件无关的网络之间的互联,包括各种物理网络技术。不是单纯两个协议,而是一组通信协议的聚合。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。


TCP】:是一个面向连接的,端对端的全双工通信协议,通信双方需要建立由软件实现的虚连接,为数据报提供可靠的数据传送服务。
TCP数据报格式:24B+数据字节。
TCP数据传输过程:建立TCP连接,传送数据。即传输层将应用层传送的数据存在缓存区中,由TCP将它分成若干段再加上TCP包头构成传送协议数据单元(TPDU)发送给IP层,采用ARQ方式发送到目的主机,目的主机对存入在输入缓存区的TPDU进行检验,确定是要求重发还是接收,结束TCP连接。
UDP】:是一个面向无连接协议,主要用于不要求确认的情形或通常只传少量数据的应用程序中。
UDP数据报格式:由源端口(2B)目的端口(2B)报文长度(2B)检验(2B)以及数据组成。
UDP数据传送:在发送端发送数据时,由UDP软件组织一个数据报,并把它交给IP软件即完成了所有的工作。在接收端,UDP软件先检查目的端口是否匹配,若匹配则放入队列中,否则丢弃。

TCP采用四层结构(如图),数据信息的传递在发送方是按照应用层—>传输层—>网际层—>网络接口层的顺序;在接收方则相反,按底层为高层服务的原则。

OSI:开放系统互连参考模型(一个理想的模型):下四层(1,2,3,4)主要提供数据传输和交换功能,以节点到节点的通信为主。上三层(5,6,7)以提供用户与应用程序之间的信息和数据处理功能为主。第4层作为上下两部分的桥梁,是最关键的部分。简言之,下四层完成通信子网功能,上三层完成资源子网功能。

·[应用层] 与OSI参考模型中的高三层任务相同,用于提供网络服务。
·[传输层] 又称主机至主机层,与OSI参考模型的传输层类似,负责主机到主机之间的端到端通信,使用传输控制协议(TCP)和用户数据包协议(UDP)。
·[网际层] 也称互联层,主要功能是处理来自传输层的分组,将分组形成数据包(IP数据包),并为数据包进行路径选择,最终将数据包从源主机发送到目的主机。常用的协议是网际协议IP协议。
·[网络接口层] 对应OSI的物理层和数据链路层,负责通过网络发送和接收IP数据报。

图解过程

图解过程

【Socket】:Socket(套接字)是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。把复杂的TCP/IP协议族隐藏在Socket接口后面,用户可直接通过这些接口去组织数据,以符合指定的协议。

TCP和UDP的区别

  1. TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。而UDP是无连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
  2. 每一条TCP连接只能是端到端的;UDP支持服务机和客户机一对一,一对多,多对一和多对多的交互通信。
  3. TCP面向字节流模式,UDP面向数据报模式。
  4. TCP提供可靠的服务,保证数据的正确性和顺序,UDP尽最大努力交付,但无法保证正确性和顺序,容易丢包。
  5. TCP要求系统资源较多,首部开销20字节。UDP的首部开销小,只有8个字节。
  6. TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而UDP不提供复杂的控制机制,这些功能都没有,(因为没有拥塞控制,所以网络出现拥塞也不会使源主机的发送速率降低)。如果需要这些细节控制,就需要交给使用UDP的应用程序去处理。
  7. 大家都知道TCP是要经过三次握手的,而UDP没有。UDP和TCP编程步骤也有些不同,如下:

TCP编程的服务器端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt(); * 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();
  4、开启监听,用函数listen();
  5、接收客户端上来的连接,用函数accept();
  6、收发数据,用函数send()和recv(),或者read()和write();
  7、关闭网络连接;
  8、关闭监听;

TCP编程的客户端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt();* 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
  4、设置要连接的对方的IP地址和端口等属性;
  5、连接服务器,用函数connect();
  6、收发数据,用函数send()和recv(),或者read()和write();
  7、关闭网络连接;

与之对应的UDP编程步骤要简单许多如下:
 UDP编程的服务器端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt();* 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();
  4、循环接收数据,用函数recvfrom();
  5、关闭网络连接;

UDP编程的客户端一般步骤是:
  1、创建一个socket,用函数socket();
  2、设置socket属性,用函数setsockopt();* 可选
  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
  4、设置对方的IP地址和端口等属性;
  5、发送数据,用函数sendto();
  6、关闭网络连接;