【计算机网络】UDP协议与TCP协议

TCP与UDP协议详解及对比
本文详细介绍了计算机网络中的端口号、UDP协议和TCP协议。阐述了端口号的概念、范围划分及常用工具。分析了UDP协议的特点、缓冲区等,列举基于UDP的应用层协议。重点讲解TCP协议的段格式、确认应答、超时重传等机制,对比了TCP与UDP,并探讨了listen第二个参数对连接队列的影响。

一、端口号

1.什么是端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序;

在这里插入图片描述

在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看);

在这里插入图片描述

服务器的同一个服务会使用多进程或者多线程的方式,对于不同的客户端请求同一个服务器的同一个端口号,此时服务端会根据IP地址进行辨别是哪一个客户端发起的请求,而对于同一个客户端(浏览器打开两个页面访问同一个服务)发起两个请求,此时会根据端口号来进行辨别。

2.端口号范围划分

0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.

1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

3.认识知名端口号(Well-Know Port Number)

有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号

ssh 服务器, 使用22端口

ftp 服务器, 使用21端口

telnet 服务器, 使用23端口

http 服务器, 使用80端口

https 服务器, 使用443

执行下面的命令, 可以看到知名端口号

cat/vim /etc/services

我们自己写一个程序使用端口号时, 要避开这些知名端口号

这里有两个问题:

1.一个进程是否可以bind多个端口号?

2.一个端口号是否可以被多个进程bind?

我们知道,数据是自底向上进行传输的,所以要保证端口号到进程的唯一性,所以一个端口号只能被一个进程bind,而一个进程可以bind多个端口号,比如bind两个端口号,一个用来传输数据,一个用来传输指令。

4.netstat

netstat是一个用来查看网络状态的重要工具

语法:netstat [选项]

功能:查看网络状态

n 拒绝显示别名,能显示数字的全部转化成数字

l 仅列出有在 Listen (监听) 的服務状态

p 显示建立相关链接的程序名

t (tcp)仅显示tcp相关选项

u (udp)仅显示udp相关选项

a (all)显示所有选项,默认不显示LISTEN相关

5.pidof

在查看服务器的进程id时非常方便.

语法:pidof [进程名]

功能:通过进程名, 查看进程id

二、UDP协议

1.UDP协议端格式

在这里插入图片描述

我们学习协议的时候,需要分出报头和有效载荷,回答如何进行解包(如何将报头和有效载荷进行分离)以及如何进行分用

UDP采用固定报头的方式,报头占用8个字节,剩下的都是有效载荷,比如我们在应用层发送的"你好"就会保存在UDP的数据中。

16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度;

如果校验和出错, 就会直接丢弃;

我们知道,Linux内核是用C语言写的,而报头是OS层面定制的协议,所以所谓的报头其实就是一种结构化数据对象。对于UDP的报头我们可以采用如如下的结构体或者位段进行表示(伪代码)

// 结构体
struct udp_hdr
{
   
   
    uint16_t src_port;
    uint16_t dsc_port;
    uint16_t length;
    uint16_t check;
};

// 位段
struct udp_hdr
{
   
   
    unsigned int src_port:16;
    unsigned int dsc_port:16;
    unsigned int length:16;
    unsigned int check:16;
};

对于数据的向下进行封装的过程我们可以采用如下伪代码进行表示:

char* hdr = malloc(XXXX);// 为报头开辟空间
char* message;//应用层传下来的数据
char* start = hdr + sizepf(udp_hdr);//指向有效载荷地址的开始
strcpy(start,message,strlen(message));//将数据拷贝到有效载荷的空间中
// 设置报头的属性
(struct udp_hdr)hdr->src_port = XXX;
(struct udp_hdr)hdr->dsc_port = YYY;
(struct udp_hdr)hdr->length = XXXX;
(struct udp_hdr)hdr->check = ZZZ;

这样就完成了数据从应用层但传输层的封装。

2.UDP的特点

UDP传输的过程类似于寄信.

无连接:

评论 63
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椿融雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值