美文网首页
TCP,UDP协议的区别

TCP,UDP协议的区别

作者: 肆意咯咯咯 | 来源:发表于2018-04-17 23:26 被阅读0次

TCP和UDP协议属于传输层协议,其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要有:Telnet、FTP、SMTP等;UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

TCP/UDP的区别

作为运输层中两个主要的协议,TCP和UDP都能向应用层提供通信服务,然而它们提供的服务差别还是很大的。
1.TCP协议是面向连接的。也就是说,应用程序在使用 TCP协议之前,必须先建立起一个 TCP连接,之后才能进行通信活动。因此,使用 TCP协议通讯就好像是打电话,通话前先要拨号,然后等对端拿起电话,建立好连接后才能开始通话,通话结束后将电话机扣上,此时相当于断开连接。
UDP协议是无连接的。不需要建立和断开连接,发送端可以在任何时候自由地发送数据,这就好像用手机发信息,它不需要号码是正确的,全凭发送端意愿进行发送,结果是什么并不能保证。
2.UDP协议支持一对一、一对多、多对一和多对多的交互通信。 而 TCP协议仅支持一对一的交互通信。
3.UDP协议是面向报文的。发送方的 UDP对应用程序交付下来的报文,再添加了首部信息之后就向下交付给 IP层。这就是说,应用层交给 UDP多长的报文,UDP会照原样发送,即一次发送一个报文。可以看出,应用程序必须控制报文的长度。TCP是面向,字节流的。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5.TCP首部开销20字节;UDP的首部开销小,只有8个字节
6.TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

TCP,UDP编程区别

通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。

SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。
SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。

基于上述不同,UDP和TCP编程步骤也有些不同,如下:


Socket通信模型.png
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编程步骤要简单许多,分别如下:
  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、关闭网络连接;

操作函数

1、 socket:

创建socket 描述符

int socket(int domain, int type, int protocol);

domain=AF_INET,socket的类型,type=SOCK_STREAM 或SOCK_DGRAM,分别表示TCP连接和UDP连接;protocol=0。

返回一个整型socket描述符。

2.bind:

将socket描述符与你本机上的一个端口相关联(仅用于服务器)

int bind(int sockfd,struct sockaddr *my_addr, int addrlen);

Sockfd是一个socket描述符

my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;

addrlen=sizeof(struct sockaddr)。

返回:成功=0;失败=-1,errno=错误号。

可以用下面的赋值自动获得本机IP地址和随机获取一个没有被占用的端口号:

my_addr.sin_port = 0; /* 系统随机选择一个未被使用的端口号 */

my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本机IP地址 */

3.Connect:

与远端服务器建立一个TCP连接 (用于客户端)

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

Sockfd是目的服务器的sockt描述符

serv_addr是包含目的机IP地址和端口号的指针。

返回:成功=0;失败=-1,errno=错误号。

4、Listen:

监听是否有服务请求 ,用于bind()后

int listen(int sockfd, int backlog);

Sockfd是Socket系统调用返回的socket 描述符;

backlog指定在请求队列中允许的最大请求数,缺省值为20。

返回:成功=0;失败=-1,errno=错误号。

5.accept:

接受来自客户的请求

int accept(int sockfd, void *addr, int *addrlen);

sockfd是被监听的socket描述符,

addr 是指向sockaddr_in变量的指针,存放客户主机的信息 ;

addrten 指向值为sizeof(struct sockaddr_in)的整型指针变量。

返回:成功返回一个新的socket描述符,来供这个新连接来使用。 错误发生时返回一个-1并且设置相应的errno值。

6.Send:

在连接(TCP)的socket方式下发送信息

int send(int sockfd, const void *msg, int len, int flags);

Sockfd是用来传输数据的socket描述符

msg是一个指向要发送数据的指针。

Len是以字节为单位的数据的长度。

flags一般情况下置为0。

7.recv:

在连接(TCP)的socket方式下接收数据

int recv(int sockfd,void *buf,int len,unsigned int flags);

Sockfd是接受数据的socket描述符;

buf 是存放接收数据的缓冲区;

len是缓冲的长度。

Flags也被置为0。

返回:实际上接收的字节数,如果连接中止,返回0,。出现错误时,返回-1并置相应的errno值。

8.sendto:

在在无连接(UDP)的socket方式下发送数据

int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);

to表示目地机的IP地址和端口号信息

tolen=sizeof (struct sockaddr)。

返回:实际发送的数据字节长度或在出现发送错误时返回-1。

9.Recvfrom()

在无连接(UDP)的socket方式下接收数据

int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);

from 保存源机的IP地址及端口号。

fromlen=sizeof(struct sockaddr)。

返回:实际存入from中的数据字节数。当出现错误时返回-1,并置相应的errno。

10.close()

释放socket,停止任何数据操作

close(sockfd);

11.shutdown:

单向关闭连接

int shutdown(int sockfd,int how);

how可以设为下列值:

·0-------不允许继续接收数据

·1-------不允许继续发送数据

·2-------不允许继续发送和接收数据,均为允许则调用close ()

shutdown在操作成功时返回0,在出现错误时返回-1(并置相应errno)。

12. gethostbyname:

域名和IP地址的转换

struct hostent *gethostbyname(const char *name);

13.inet_pton函数:

将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。

int inet_pton(int family,const char * strptr,void * addrptr);

TCP和UDP区别

相关文章

  • TCP和UDP的区别

    TCP和UDP的区别: TCP协议和UDP协议特性区别总结: TCP协议可靠;UDP协议不可靠 TCP协议是面向连...

  • tcp和udp

    TCP和UDP的区别(转) TCP****协议与UDP协议的区别 首先咱们弄清楚, TCP 协议和 UCP ...

  • iOS 网络相关面试题

    问题:TCP、UDP TCP/UDP 传输层协议 ||—— UDP:用户数据报协议 TCP与UDP的区别: 问题...

  • TCP/UDP

    1.TCP和UDP的区别? TCP:传输控制协议 UDP: 用户数据报协议 TCP/UDP 都是面向传输层协议 1...

  • 第九篇 异常处理和并发编程1

    一、异常处理 二、基于udp协议的套接字通讯 三、udp协议不会粘包 Tcp和udp的区别Tcp协议是可靠的协议。...

  • TCP

    TCP和UDP端口可以重复 TCP/IP协议中端口,范围从0到65535 TCP和UDP的区别 TCP协议需要创建...

  • TCP/IP协议,TCP、UDP区别与联系

    TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UDP协议与TCP/IP协议的联系,很多人犯糊涂了, 一...

  • TCP和UDP的区别(转)

    TCP协议与UDP协议的区别首先咱们弄清楚,****TCP****协议和****UCP****协议与****TCP...

  • TCP和UDP协议

    TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UDP协议与TCP/IP协议的联系,很多人犯糊涂了,一直...

  • TCP和UDP协议之间的区别,前端基础面试题

    前端基础面试题,TCP和UDP协议之间的区别 tcp和udp作为传输层的两个协议,主要区别: 1,tcp 是面向链...

网友评论

      本文标题:TCP,UDP协议的区别

      本文链接:https://www.haomeiwen.com/subject/izdjkftx.html