网站图片加载 优化,长尾关键词排名推广,网店运营招聘要求,伊春北京网站建设目录
再谈端口号
端口号范围划分
UDP协议
UDP协议端格式
UDP的特点
UDP的缓冲区
UDP注意事项
进一步深刻理解 再谈端口号 在上图中#xff0c;有两个客户端A和B#xff0c;客户端A打开了两个浏览器#xff0c;这两个客户端都访问同一个服务器#xff0c;都访问服务…目录
再谈端口号
端口号范围划分
UDP协议
UDP协议端格式
UDP的特点
UDP的缓冲区
UDP注意事项
进一步深刻理解 再谈端口号 在上图中有两个客户端A和B客户端A打开了两个浏览器这两个客户端都访问同一个服务器都访问服务器的80端口由于A和B的IP地址是不一样的服务器在返回应答时就能根据双方的IP地址区分这两台不同的主机。同一台主机上两个不同的请求对应的端口号不一样服务器在应答时就可以准确把应答推送给特定端口号。在未来通过TCP/UDP通信时TCP/UDP报文里会包含端口信息IP报文里会包含源IP目标IP构成了四元组构成套接字通信。在客户端发起请求时要把服务器的IP和端口以及自己的IP和端口写进来构成上图的报文推送给服务器端这就是服务器端为什么能收到你发来的数据也同时能知道你客户端的源IP和源端口号也就知道这个消息是谁发的。这样的四元组一定出现在底层的网络报文中的。
另外还有一个叫“协议号”的东西会在IP首部里面有一个协议号用来表明通信时采用的上层协议是TCP/UDP的方便把IP报文交给传输层。这样在TCP/IP协议中我们就可以通过用“源IP”、“源端口号”、“目的IP”、“目的端口号”、“协议号”这样一个五元组来标识一个通信衡量通信的双方是谁、用什么协议来通信可以通过netstat -n查看。 端口号范围划分
0-1023知名端口号HTTP、FTP、SSH这些广为使用的应用层协议它们的端口号是固定的。1024-65535操作系统动态分配的端口号。客户端的端口号就是在这个范围内选择。
知名端口号
有些服务器非常常用为了方便使用人们约定了一些常见的服务器一些常见的知名端口号
ssh服务器使用22号端口ftp服务器使用21号端口http服务器使用80号端口https服务器使用443号端口
使用cat /etc/services可以查看知名端口号都有哪些。
有两个问题 1.一个进程是否可以bind多个端口号 可以我们要的是从端口号到服务进程的唯一性。 2.一个端口号是否可以被多个进程bind 不可以理由同上。
我们再来理解一下端口号和进程之间的关系进程在系统内就是struct task_struct可以认为OS维护了一张哈希表key就是端口号value就是进程pcb对应的地址。当底层有数据来了报文里必定携带了目的端口号那目的端口号去查哈希表找到进程就可以把数据交给进程。所以可以认为bind就是把port和进程pcb做关联。因为key值必须唯一所以一个端口不能绑定多个进程。
UDP协议
UDP协议端格式 UDP的报头是一个结构体报头里的每个字段都是结构体中的成员属性。通过源端口号和目的端口号就可以知道是哪个进程发的以及发给哪个进程。16位UDP长度代表报文的总长度包括UDP首部UDP数据。报头部分是8字节。如果校验出错就直接丢弃所以UDP不保证可靠性。
无论哪种协议都必须解决两个子问题
如何将报头和有效载荷进行分离封装如何将有效载荷进行分用
对于第1个问题通过使用固定长度的报头8字节分离前8个字节就是报头。UDP是面向数据报的通过16位UDP长度保证读到的报文是完整的整个报头的长度减去8字节就是有效载荷的长度。对于第2个问题因为报文里包含了16位目的端口号找到对应的进程就可以将数据分用到应用进程。
我们在来理解一个问题在之前写套接字时为什么端口号的类型是uint16_t呢因为协议就是这么规定的
UDP的特点
无连接知道对端的IP和端口号就可以直接进行通信不需要建立连接。不可靠没有确认机制没有重传机制如果因为网络故障该段无法发送到对方UDP协议层也不会给应用层返回任何错误信息。面向数据报应用层交给UDP多长的报文UDP原样发送既不会拆分也不会合并。
用UDP传输100个字节数据
如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的一次 recvfrom, 接收 100 个字节; 而不能循环调用 10 次 recvfrom, 每次接收 10 个字节。
UDP的缓冲区
UDP没有真正意义上的发送缓冲区调用sendto会直接交给内核由内核将数据传给网络层协议进行后续的传输动作。但是有接收缓冲区但这个接收缓冲区不能保证收到的UDP报和发送的UDP报顺序一致如果缓冲区满了再到达的UDP数据就会被丢弃。UDP支持全双工可以同时读写。由于UDP不需要做可靠性保证所以没有发送缓冲区。
UDP注意事项
UDP协议首部有一个16位的最大长度所以UDP报文最大长度是2^16位约64K包含UDP首部所以单个UDP报文长度不能超过64K。如果超过64K就需要在应用层手动分包多次发送在接收端手动拼装。
进一步深刻理解
1.udp报头
在进行UDP协议的交换时用的是对结构体二进制流序列化和反序列化。可以这么做的原因是因为内核不涉及到业务并且任何OS都是C语言写的只要转化为网络序列就不会出错。OS的标准化程度比较高。而应用层所用的语言不同不同语言不能统一需要序列化和反序列化。
2.对报文的理解
OS内可能同时存在大量的报文有的可能正在被向上交付有的在被向下交付所以OS要对报文进行管理先描述在组织。