网络编程套接字(初识)

什么叫网络编程套接字
网络编程套接字–“socket”用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

认识IP地址

IP协议有两个版本,IPv6和IPv4,凡是提到IP协议,没有特殊说明时,默认是指IPv4

  • IP地址是指在IP协议中,用来标识不同主机的地址
  • 对于IPv4而言,IP地址是一个4字节,32位的整数
  • 我们通常使用“点分十进制”来表示一个IP地址,例如:192.128.3.1(用点分割的每一个数字表示一个字节,范围是0–255)

源IP地址和目的IP地址

在IP数据报头部,有两个地址,一个叫源IP地址,一个叫目的IP地址

源IP地址是由IP层进行IP选路时,自动添加到IP报头里边的,或者由客户端执行bind函数手工指定的。
目的IP地址是由connect或者sendto得到的。

端口号

端口号(port)是传输层协议的内容

  • 端口号是一个2字节,16为整数
  • 端口号用于标识一个进程,告诉操作系统,当前数据要交给哪一个进程
  • IP地址+端口号用于标识某个主机上的某个进程
  • 一个端口号只能被一个进程所占用

端口号与进程ID

在学习系统编程时,我们学习到pid表示唯一个进程,而端口号也是唯一表示一个进程。
那两者之间的关系是怎样呢?
需要说明的是:PID指的不是端口(port id),而是Process ID进程号
而进程号就是系统分配给每一个进程的唯一标识符,PID就是个进程的身份标识符,只要程序一旦运行时,系统自动分配给进程一个独一无二的PID,进程终止时,PID被系统回收,可能会分配给新的程序。

总结:
一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定。

源端口号和目的端口号

传输层协议数据段有两个端口号,一个叫源端口号,一个叫目的端口号,表示数据从哪来,到哪去。

TCP协议

TCP(Transmission Control Protocol)意为传输控制协议。
- 传输层协议
- 有连接
- 可靠传输
- 面向字节流

UDP协议

UDP(User Datagram Protocol)意为用户数据报协议。
- 传输层协议
- 无连接
- 不可靠连接
- 面向数据报

网络字节序

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

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。

不管这台主机是大端机还是小端机,都会按照TCP/IP规定的网络字节序来发送/接收数据。

如果当前发送主机是小端,就需要先将数据转成大端,否则就忽略,直接发送即可。
这里写图片描述
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
这里写图片描述
h表示host,n表示network;l表示32位长整数,s表示16位短整数。

例如:htonl表示将32位的长整数从主机字节序转换为网络字节序。

如果主机是小端字节序,这些函数将参数作相应的大小端转换,然后返回;如果主机是大端字节序,函数不作任何转换,将参数原样返回。

猜你喜欢

转载自blog.csdn.net/tanrui519521/article/details/80701170