IP地址、端口号、网络字节序

本文中部分名词可见: 协议、TCP/IP模型、数据包封装与分用
一.IP地址
1. 简单认识
IP协议有两个版本:IPv4和IPv6。
(1)IP地址在IP协议中,用来标识网络中不同主机的地址。
(2)对于IPv4来讲,IP地址是一个4字节,32位的整数; 对于IPv6来讲,IP地址是一个16字节,128位的整数。
         (3)我们常用“点分十进制“的字符串表示IP地址,例如:192.168.2.13,其中用点分割的每一个数字表示一个字节,范围是0-255。
2. 源IP地址与目的IP地址
在IP数据的包头信息中,有两个IP地址,分别叫做源IP地址、目的IP地址。
因为,我们不仅要知道数据是谁发的,也要知道数据是要发给谁的。
二. 端口号  
我们仅仅知道IP地址,知道该把数据发送给哪台机器是远不够的。我们还需要知道这些数据是要发给机器 哪个程序进行解析,所以我们需要一个其他的标识,所以就有了“端口号”。
1. 简单认识
端口号是传输层协议的内容。
(1)端口号是一个2字节16位的整数;
(2)端口号用来标识一个进程,告诉操作系统,当前的数据要交给哪一个进程来处理;
(3)所以“IP地址+端口号”即套接字socket可以唯一地标识某一台主机上的某一个进程;
(4)一个端口号只能被一个进程占用。
2. 区分“端口号”和“进程ID”
之前,我们学进程章节的时候,也说过进程ID可以表示唯一的一个进程。拿这两者的不同在什么地方呢?
举个例子吧,比如学号和身份证号。 进程的PID相当于一个人的身份证号,在任何地方都唯一标识某个人,而端口号相当于一个学号,它只在学校里来唯一标识一个学生。因此,PID无论在哪里都可以唯一标识一个进程,而端口号只在网络通信中来唯一标识一个进程。
        另外, 一个进程可以绑定 多个端口号,因为很多源主机可以通过不同的端口号来找到目的主机中的同一进程来处理不同的数据。 但是一个端口号不能被多个进程绑定,如果一个端口号绑定了多个进程,那多个进程都对同一数据进行处理,那要采取那个进程返回的结果呢,我们无法确定。
3. 源端口号和目的端口号
        传输层协议(TCP和UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号。分别用于描述:数据是谁发的,数据要发给谁。
三. 网络字节序
         当我们将源主机中的数据发送给目的主机时,是如何发送的呢?
         根据冯诺依曼体系结构,我们知道源主机要通过内存将数据先发给源主机的外设(网卡),然后发送到网络中,目的主机将网络中的数据项接收到目的主机的网卡上,再传入到目的主机的内存中,然后通过CPU对数据进行处理。
         而数据在内存中的存储有大小端之分。如果在源主机的内存为小端,而目的主机以大端的形式来接受数据时,此时,就会导致数据错误。而不仅不同主机的大小端不同,在网络序列中也有大小端之分。这样一来,就更加混乱了。
         所以,TCP/IP协议规定,网络数据流均采用大端,即低地址处放数据的高位。
       如果源主机为小端则在发送数据时应先转为大端,如果是大端,则不用转化。然后将大端数据存放在发送缓冲区中,直接发送到网络中即可。

当目的主机在接受消息时,先将网络中的大端数据存储到接受缓冲区中。如果目的主机是小端,则将大端数据转换为小端存储到内存中,如果目的主机是大端则不用转换直接存储到内存中。

同时,有以下规定:
发送主机通常把发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收 主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
因此,网络数据流的地址 应该这样规定: 先发出的数据是低地址,后发出的数据是高地址
所以,我们有以下库函数做网络字节序和主机字节序的转换:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
其中,h代表host即主机,n表示network即网络,l表示32长整数,s表示16位短整数。所以比如htonl函数是将32位的长整型从主机字节序转换为网络字节序,其他函数类似。
若主机是小端字节序,这些函数将参数做相应的大小端转换然后返回; 若主机是小端字节序,这些函数将不做转换,将参数原封不动地返回。

网络编程-IP地址、端口号、网络字节序相关推荐

  1. 网络编程---Ip和端口号

    网络编程 网络编程的要素: IP 端口号 网络通信协议 IP ip地址:InetAddress 唯一定义一台网络上的计算机 127.0.0.1 : 本机localhost ip地址的分类 ipv4/i ...

  2. 网络编程------IP地址,端口号,套接字,网络字节序

    IP地址         IP地址是IP协议中,用来标识网络中的唯一一台主机的地址.IP协议有两个版本IPv4,IPv6.在IPv4中,IP地址是一个4字节的32位的整数.在IPv6中,IP地址是一个 ...

  3. Python网络编程基础之ip地址,端口号,TCP,socket

    Python网络编程基础 IP地址 ip地址表现形式 查看ip地址 Linux Windows 检查网络是否正常 端口与端口号 端口号分类 知名端口号 动态端口号 TCP协议 概念 TCP通讯步骤 特 ...

  4. C# 网络编程 IP地址转换

    IP地址 IP地址:是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围内惟一的标识符.一个IP地址主要由两部分组成:网络地址和主机地址. 网络地址由因特网权力机构分配,主机地址由各个网络的管 ...

  5. java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...

    使用java进行网络程序的开发,可以说是一件令人愉悦的事情,对于用惯了C++网络接口编程的人来说,当他们首次使用Java开发网络应用程序,会发现java开发网络应用是如此的简单,甚至仅用几分钟时间,您 ...

  6. Socket编程之地址之间转换、字节序转换

    目录 char *inet_ntoa(struct in_addr in); int inet_aton(const char *cp, struct in_addr *inp); in_addr_t ...

  7. tcping : ping ip地址+端口号

    起因:windows下cmd ping命令无法ping某一个端口. 对策:使用tcping工具了,Windows没有自带这个小工具,需要自己下载下来,放到 C:\Windows\System32 下. ...

  8. 网络通信-基本概念:网络、IP地址、端口、socket

    本文目录 网络通信 1 网络 1.1 网络定义 1.2 使用网络的目的 1.3 总结 2 IP地址 2.1 ip地址的作用 2.2 ip地址的分类 2.2.1 A类IP地址 2.2.2 B类IP地址 ...

  9. 计算机ip地址无法修改密码,手提电脑怎么修改无线网络的IP地址|无线网络怎么修改密码...

    许多朋友都有手提电脑,由于要经常变动地点,就要遇到修改IP地址的问题.那你知道怎样给手提电脑修改无线网络的IP地址吗?下面小编告诉你! 手提电脑修改无线网络的IP地址的方法 点击右键桌面"网 ...

最新文章

  1. Android Intent hasExtra()方法的使用
  2. abs 不会整数 方法 溢出_在 Golang 中针对 int64 类型优化 abs()
  3. 荆门市掇刀石中学2021高考成绩查询,2021年荆门中考所有高中学校排名 荆门重点高中分数线...
  4. ABAP development tools实现原理介绍
  5. Android public class MyApplication extends MultiDexApplication使用
  6. 对微软实习生或者工作感兴趣的读者, 目前我的项目是...
  7. 输入n个字符串字典序排序_30个Python奇淫技巧集
  8. 人教版三年级下册计算机课教案,人教版三年级下册19课教案
  9. 一个免费功能强大的谷歌翻译api
  10. 最佳 3D 建模软件
  11. 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”, 问这个人在以后的某一天中是“打鱼”还是“晒网”?(考虑中间有几个闰年)
  12. <Navigate>与useNavigate()
  13. 《投射技术》与科学研究汉字笔迹心理学的希望
  14. html 重力感应效果,HTML5 重力感应效果,实现摇一摇效果
  15. Unparseable date: xxxxxx
  16. 第一章 接口测试基础
  17. Android ocr识别文字介绍(文字识别)
  18. 校招选择题汇总【图形推理(1)】含答案解析
  19. Java中如何创建一个文件或者文件夹
  20. SAP-MM知识精解-采购标准业务(02-01)-消耗性物料的采购之基于成本中心的采购

热门文章

  1. uniapp GPS定位功能的实现
  2. 【晚唐 杜牧】九日齐山登高
  3. 显示桌面图标没有怎么解决
  4. Inno安装语言注意
  5. datediff()函数的使用
  6. 知网专利信息爬虫!强无敌!
  7. (转)25款实用的桌面版博客编辑器
  8. JQuery运行机制及原理
  9. QT-按下按钮实现页面跳转
  10. Android中设置定时闹钟以及AlarmManager详解