订阅
纠错
加入自媒体

在进行UDP编程的时候,一次发送多少bytes好?

2021-04-26 16:32
拓跋阿秀
关注

服务器:

fd:accept返回的连接描述字,每个连接有一个,生命周期为连接周期。

注:sockfd是监听描述字,一个服务器只有一个,用于监听是否有连接;fd是连接描述字,用于每个连接的操作。

fd:连接描述字。

buf:缓冲区buf。

count:缓冲区长度。

注:大于0表示读取的字节数,返回0表示文件读取结束,小于0表示发生错误。

sockfd:服务器socket描述字。

addr:指向地址结构指针。

addrlen:协议地址长度。

注:一旦accept某个客户机请求成功将返回一个全新的描述符用于标识具体客户的TCP连接。

sockfd:要监听的sock描述字。

backlog:socket可以排队的最大连接数。

sockfd:socket返回的套接字描述符,类似于文件描述符fd。

addr:有个sockaddr类型数据的指针,指向的是被绑定结构变量。

addrlen:地址长度。

domain:协议域,决定了socket的地址类型,IPv4为AF_INET。

type:指定socket类型,SOCK_STREAM为TCP连接。

protocol:指定协议。IPPROTO_TCP表示TCP协议,为0时自动选择type默认协议。

创建socket -> int socket(int domain, int type, int protocol);

绑定socket和端口号 -> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

   // IPv4的sockaddr地址结构
   struct sockaddr_in {
       sa_family_t sin_family;    // 协议类型,AF_INET
       in_port_t sin_port;    // 端口号
       struct in_addr sin_addr;    // IP地址
   };
   struct in_addr {
       uint32_t s_addr;
   }

监听端口号 -> int listen(int sockfd, int backlog);

接收用户请求 -> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

从socket中读取字符 -> ssize_t read(int fd, void *buf, size_t count);

关闭socket -> int close(int fd);

客户机:

fd:同服务器端fd。

fd、buf、count:同read中意义。

大于0表示写了部分或全部数据,小于0表示出错。

sockfd客户端的sock描述字。

addr:服务器的地址。

addrlen:socket地址长度。

创建socket -> int socket(int domain, int type, int protocol);

连接指定计算机 -> int connect(int sockfd, struct sockaddr* addr, socklen_t addrlen);

向socket写入信息 -> ssize_t write(int fd, const void *buf, size_t count);

关闭oscket -> int close(int fd);

84、TCP 协议如何保证可靠传输?

第一种回答确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。数据校验:TCP报文头有校验和,用于校验报文是否损坏。数据合理分片和排序:tcp会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新排序后交给应用层。而UDP:IP数据报大于1500字节,大于MTU。这个时候发送方的IP层就需要分片,把数据报分成若干片,是的每一片都小于MTU。而接收方IP层则需要进行数据报的重组。由于UDP的特性,某一片数据丢失时,接收方便无法重组数据报,导致丢弃整个UDP数据报。流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。第二种回答

建立连接(标志位):通信前确认通信实体存在。

序号机制(序号、确认号):确保了数据是按序、完整到达。

数据校验(校验和):CRC校验全部数据。

超时重传(定时器):保证因链路故障未能到达数据能够被多次重发。

窗口机制(窗口):提供流量控制,避免过量发送。

拥塞控制:同上。

第三种回答

首部校验这个校验机制能够确保数据传输不会出错吗?答案是不能。

原因

TCP协议中规定,TCP的首部字段中有一个字段是校验和,发送方将伪首部、TCP首部、TCP数据使用累加和校验的方式计算出一个数字,然后存放在首部的校验和字段里,接收者收到TCP包后重复这个过程,然后将计算出的校验和和接收到的首部中的校验和比较,如果不一致则说明数据在传输过程中出错。

这就是TCP的数据校验机制。但是这个机制能够保证检查出一切错误吗?显然不能。

因为这种校验方式是累加和,也就是将一系列的数字(TCP协议规定的是数据中的每16个比特位数据作为一个数字)求和后取末位。但是小学生都知道A+B=B+A,假如在传输的过程中有前后两个16比特位的数据前后颠倒了(至于为什么这么巧合?我不知道,也许路由器有bug?也许是宇宙中的高能粒子击中了电缆?反正这个事情的概率不为零,就有可能会发生),那么校验和的计算结果和颠倒之前是一样的,那么接收端肯定无法检查出这是错误的数据。

解决方案

传输之前先使用MD5加密数据获得摘要,跟数据一起发送到服务端,服务端接收之后对数据也进行MD5加密,如果加密结果和摘要一致,则认为没有问题

85、UDP是什么

提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。

86、TCP和UDP的区别

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的

UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

7、UDP是面向报文的,发送方的UDP对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层,论应用层交给UDP多长的报文,它统统发送,一次发送一个。而对接收方,接到后直接去除首部,交给上面的应用层就完成任务了。因此,它需要应用层控制报文的大小

TCP是面向字节流的,它把上面应用层交下来的数据看成无结构的字节流会发送,可以想象成流水形式的,发送方TCP会将数据放入“蓄水池”(缓存区),等到可以发送的时候就发送,不能发送就等着TCP会根据当前网络的拥塞状态来确定每个报文段的大小。

87、UDP的特点有哪些(附赠TCP的特点)?

UDP是无连接的;UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);UDP支持一对一、一对多、多对一和多对多的交互通信;UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

那么,再说一次TCP的特点:

TCP是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;面向字节流。TCP中的“流”(stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

88、TCP对应的应用层协议

FTP:定义了文件传输协议,使用21端口.Telnet:它是一种用于远程登陆的端口,23端口SMTP:定义了简单邮件传送协议,服务器开放的是25号端口。POP3:它是和SMTP对应,POP3用于接收邮件。

89、UDP对应的应用层协议

DNS:用于域名解析服务,用的是53号端口SNMP:简单网络管理协议,使用161号端口TFTP(Trival File Transfer Protocal):简单文件传输协议,69

90、数据链路层常见协议?可以说一下吗?

协议名称作用ARP地址解析协议根据IP地址获取物理地址RARP反向地址转换协议根据物理地址获取IP地址PPP点对点协议主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案“

91、Ping命令基于哪一层协议的原理是什么?

ping命令基于网络层的命令,是基于ICMP协议工作的。

92、在进行UDP编程的时候,一次发送多少bytes好?

当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的。

我这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助:首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层.UDP属于运输层,

下面我们由下至上一步一步来看:以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.这个1500字节被称为链路层的MTU(最大传输单元).但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区.并不包括链路层的首部和尾部的18个字节.

所以,事实上,这个1500字节就是网络层IP数据报的长度限制。因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.这个1472字节就是我们可以使用的字节数。

当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报。

因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好.

进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.

鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.最好将UDP的数据长度控件在548字节(576-8-20)以内

93、TCP 利用滑动窗口实现流量控制的机制?

流量控制是为了控制发送方发送速率,保证接收方来得及接收。TCP 利用滑动窗口实现流量控制。

TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据。

例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。

94、可以解释一下RTO,RTT和超时重传分别是什么吗?

超时重传:发送端发送报文后若长时间未收到确认的报文则需要重发该报文。可能有以下几种情况:

发送的数据没能到达接收端,所以对方没有响应。

接收端接收到数据,但是ACK报文在返回过程中丢失。

接收端拒绝或丢弃数据。

RTO:从上一次发送数据,因为长期没有收到ACK响应,到下一次重发之间的时间。就是重传间隔。

通常每次重传RTO是前一次重传间隔的两倍,计量单位通常是RTT。例:1RTT,2RTT,4RTT,8RTT......

重传次数到达上限之后停止重传。

RTT:数据从发送到接收到对方响应之间的时间间隔,即数据报在网络中一个往返用时。大小不稳定。

<上一页  1  2  3  4  下一页>  余下全文
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    人工智能 猎头职位 更多
    扫码关注公众号
    OFweek人工智能网
    获取更多精彩内容
    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号