IP地址与端口号

1.IP地址

  • IPv4版本的IP地址为4字节,也就是32位
  • 网络层的数据报中封装两个IP地址,一个源IP地址(数据报源主机的IP),一个目的IP地址(数据报目的主机的IP)
  • 一个数据报的头部不应该只存在源IP地址和目的IP地址,还应该存在一个协议字段告诉应该交给上层的哪一个协议

2.端口号

《1》基本概念

  • 端口号是传输层的概念

  • 端口号是一个2字节16位的整数

  • 端口号用来标识一个进程,用来告诉OS,将数据交给哪一个进程

  • IP地址+端口号可以唯一的表示网络中一个主机的进程

  • 一个端口号只能被一个进程占用
    《2》端口号与进程 ID
    一个进程PID也可以唯一的标识一个进程,那么端口号的意义在哪?

  • 当一个进程退出时,再次启动进程时,它的PID已经变化,所以要将进程与端口号绑定来标识这个进程

  • 一个进程可以绑定多个端口号,但是一个端口号只能被一个进程绑定
    《3》源端口号与目的端口号
    传输层协议TCP/UDP的数据段中,也存在两个字段,一个是源端口号,一个是目的端口号,它用来表示这个数据是哪一个进程发的,要发给哪一个进程。

2.TCP协议与UDP协议特点

TCP:

  • 传输层协议
  • 面向连接,两个主机只有建议连接之后才可以通信
  • 可靠传输,建立连接之后,占用端到端的通信资源
  • 面向字节流,发送的字节流数据之间没有明确的间隔
    UDP
  • 传输层协议
  • 面向无连接,尽最大努力交付
  • 不可靠的传输
  • 面向数据报,发送的一个数据是一个整体,它们之间有明确的间隔

3.网络字节序

内存中大于1个字节的数据相对于内存地址存在大小端之分,磁盘文件中多字节数据相对于偏移地址也存在大小端之分,网络中的数据流也存在大小端之分。
网络字节流的大小端:

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。
  • 网络数据流的地址规定,先发出的数据是低地址,后发出的数据是高地址。
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
  • 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据。如果当前发送主机是小端, 就需要先将数据转成大端, 否则就忽略, 直接发送。

为了使网络程序具有可移植性,使同样的C代码在大端和小端计算机编译后都能正常运行,可以调用以下库函数对网络字节序和主机字节序的转换

#include <arpa/inet.h>
//h--host主机,n--net网络,l--long长整型32位,s--short短整型16位
uint32_t htonl(uint32_t hostlong);//主机-->网络(32位)
uint16_t htons(uint16_t hostshort);//主机-->网络(16位)
uint32_t ntohl(uint32_t netlong);//网络-->主机(32位)
uint16_t ntohs(uint16_t netshort);//网络-->主机(16位)

猜你喜欢

转载自blog.csdn.net/weixin_41892460/article/details/86963316