博客
关于我
2-1:套接字(Socket)编程之必备知识
阅读量:615 次
发布时间:2019-03-12

本文共 1251 字,大约阅读时间需要 4 分钟。

文章目录

仔细观察可以发现,主机与主机完成网络通信本质其实进程间通信,例如我们使用QQ相互发送消息以及访问百度服务器查询关键词等等。

对于同一台主机的两个进程,要完成通信,方法有很多种,例如管道,共享内存等。而不同主机的两个继承想要完成通信则必须要通过网络,其中有一个非常关键的问题就是如果把一个主机的数据发送到另一个数据,这就需要IP地址,发送过去之后,一个主机上又有可能运行多个进程,如何准确让QQ这个进程接受呢,这就需要端口号所以说,IP+端口号标识了全网唯一的进程

在这里插入图片描述

(1)IP地址和端口号

A:源IP地址和目的IP地址

前文说过:IP地址用于标识公网中某一个台主机

在这里插入图片描述

所以它能确保数据准确发送给目的主机

B:端口号

在传输层中也有类似于IP地址和MAC地址的概念,它就是端口号,端口号用来确定应该将数据交付给哪一个应用程序

在这里插入图片描述
我们都知道所有进程都需要一个PID来进行表示,但是不是所有的进程都是网络进程,所以不是所有进程都需要端口号。
同时一个进程可以绑定多个端口号(就像学生在学校可以有学号,在健身房可以有会员号),但是一个端口号不能被多个进程绑定

(2)TCP

为了实现数据的可靠传输,需要考虑很多的事情,比如数据是否被破坏,丢包以及分片顺序混乱等问题

所以TCP通过校验和,序列号确认应答,重发控制,连接管理以及窗口控制等机制实现可靠性传输

在这里插入图片描述

(3)UDP

UDP和TCP不一样,它不提供复杂的控制机制,它的主要职责就是发送,数据丢包不丢包,接受没有接受和它没有一点关系

(4)网络字节序

我们知道数据才内存中存放时有大端和小端之分

在这里插入图片描述
而在网络数据流中,也有大小端之分。TCP/IP协议规定,网络数据流应该采用大端字节序,即低地址高字节

无论一台主机是大端还是小端机,都要按照这个规定来发送数据,如果当前主机是小端就要将小端转为大端,然后从内存的低地址到高地址发送数据,接收方也是按照从低到高的顺序接受

在这里插入图片描述

这样做很大的优点就是数据在传输的同时就可以做运算了,如果是小端的话就必须要等待所有数据全部就为了才可以开始操作

所以为了更加方便操作,C中也提供了相应的接口以供主机字节序和网络字节序间的转换

#include 
/* 32位整数从主机字节序转换为网络字节序 */uint32_t htonl(uint32_t hostlong);/* 16位整数从主机字节序转换为网络字节序 */uint16_t htons(uint16_t hostshort);/* 32位整数从网络字节序转换为主机字节序 */uint32_t ntohl(uint32_t netlong);/* 16位整数从网络字节序转换为主机字节序 */uint16_t ntohs(uint16_t netshort);
  • 其中h表示hostn表示networkl表示32位长整数,s表示16位短整数
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;如果是大端字节序则不作修改,直接返回

转载地址:http://uarxz.baihongyu.com/

你可能感兴趣的文章
MySQL函数
查看>>
mysql函数汇总之字符串函数
查看>>
mysql函数汇总之数学函数
查看>>
mysql函数汇总之日期和时间函数
查看>>
mysql函数汇总之条件判断函数
查看>>
mysql函数汇总之系统信息函数
查看>>
MySQL函数简介
查看>>
mysql函数遍历json数组
查看>>
MySQL函数(转发)
查看>>
mysql分区表
查看>>
MySQL分层架构与运行机制详解
查看>>
mysql分库分表中间件简书_MySQL分库分表
查看>>
MySQL分库分表会带来哪些问题?分库分表问题
查看>>
MySQL分组函数
查看>>
MySQL分组查询
查看>>
Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
查看>>
mySql分页Iimit优化
查看>>
MySQL分页查询
查看>>
mysql列转行函数是什么
查看>>
mysql创建函数报错_mysql在创建存储函数时报错
查看>>