Linux网络--2、Socket编程
目录
一、前言
二、认识IP
2.1理解源IP和目的IP
三、认识端口号
3.1结构与划分
3.2port与pid的理解
3.3理解socket
四、传输层典型协议
4.1TCP
4.2UDP
4.3网络字节序
五、Socket编程接口
一、前言
前文我们了解了网络通信的基本过程和原理,那我们该如何操作实现网络通信?
二、认识IP
2.1理解源IP和目的IP
IP在网络中,用来标识主机的唯一性,通过IP找到主机
我们在网络通信过程中我们要知道数据传输到主机并不是主要目的,数据是给人用的,人如何看到并使用这些数据?通过启动进程(一系列app),换句话说,进程是⼈在系统中的代表,只要把数据给进程,⼈就相当于就拿到了数据。
数据传输到主机不是⽬的,⽽是⼿段。到达主机内部,在交给主机内的进程,才是⽬的。但是系统中,同时会存在⾮常多的进程,当数据到达⽬标主机之后,怎么转发给⽬标进程?这就要在⽹络的背景下,在系统中,标识主机的唯⼀性。

三、认识端口号
在上段中我们找到了主机,但如何找到特定进程?这就要引出我们的端口号了!
3.1结构与划分
端⼝号( port )是传输层协议的内容.端⼝号是⼀个 2 字节 16 位的整数;端⼝号⽤来标识⼀个进程, 告诉操作系统, 当前的这个数据要交给哪⼀个进程来处理;IP地址 + 端⼝号能够标识⽹络上的某⼀台主机的某⼀个进程;⼀个端⼝号只能被⼀个进程占⽤.端⼝号范围划分0 - 1023 : 知名端⼝号, HTTP, FTP, SSH 等这些⼴为使⽤的应⽤层协议, 他们的端⼝号都是固定的.1024 - 65535 : 操作系统动态分配的端⼝号. 客⼾端程序的端⼝号, 就是由操作系统从这个范围分配的.传输层协议( TCP 和 UDP )的数据段中有两个端⼝号, 分别叫做源端⼝号和⽬的端⼝号. 就是在描述 "数据是谁发的, 要发给谁";
3.2port与pid的理解
之前在学习系统编程的时候, 学习了 pid 表⽰唯⼀⼀个进程; 此处我们的端⼝号也是唯⼀表⽰⼀个进程. 那么这两者之间是怎样的关系?⼀个进程可以绑定多个端⼝号; 但是⼀个端⼝号不能被多个进程绑定;进程 PID 属于系统概念,技术上也具有唯⼀性,确实可以⽤来标识唯⼀的⼀个进程,但是这样做,会让系统进程管理和⽹络强耦合,实际设计的时候,并没有选择这样做。
3.3理解socket
综上, IP 地址⽤来标识互联⽹中唯⼀的⼀台主机, port ⽤来标识该主机上唯⼀的⼀个⽹络进程IP+Port 就能表⽰互联⽹中唯⼀的⼀个进程所以,通信的时候,本质是两个互联⽹进程代表⼈来进⾏通信,{srcIp,srcPort,dstIp,dstPort} 这样的4元组就能标识互联⽹中唯⼆的两个进程所以,⽹络通信的本质,也是进程间通信我们把 ip+port 叫做套接字 socket
四、传输层典型协议
传输层是属于内核的,那么我们要通过⽹络协议栈进⾏通信,必定调⽤的是传输层提供的系统调⽤,来进⾏的⽹络通信
4.1TCP
4.2UDP
4.3网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有⼤端和⼩端之分, 磁盘⽂件中的多字节数据相对于⽂件中的偏移地址也有⼤端⼩端之分, ⽹络数据流同样有⼤端⼩端之分. 那么如何定义⽹络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到⾼的顺序发出;接收主机把从⽹络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到⾼的顺序保存;因此,⽹络数据流的地址应这样规定: 先发出的数据是低地址,后发出的数据是⾼地址.TCP/IP协议规定,⽹络数据流应采⽤⼤端字节序,即低地址⾼字节.不管这台主机是⼤端机还是⼩端机, 都会按照这个TCP/IP规定的⽹络字节序来发送/接收数据;如果当前发送主机是⼩端, 就需要先将数据转成⼤端; 否则就忽略, 直接发送即可;所有发送到⽹络上的数据,都必须是⼤端的!
五、Socket编程接口
简单API接口
// 创建 socket ⽂件描述符 (TCP/UDP, 客⼾端 + 服务器)
int socket(int domain, int type, int protocol);// 绑定端⼝号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);// 建⽴连接 (TCP, 客⼾端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);socket API是⼀层抽象的⽹络编程接⼝,适⽤于各种底层⽹络协议,如IPv4、IPv6,以及后⾯要讲的UNIX
Domain Socket. 然⽽, 各种⽹络协议的地址格式并不相同.
理解sockaddr