【网络】----Socket套接字

  • 数据的序列化和反序列化:数据进行可持续化存储时,对数据的组织存储形式就是序列化;将可持续存储的文件中获取数据的过程就是反序列化。

socket接口在读写数据时,都是按字符串的方式接收的,若要传输一个“结构化的数据”,就需要使用序列化和反序列化。
序列化是将数据由多变到一的过程,反序列化是将数据由一分为多的过程。

ip地址唯一标识公网当中的一台主机
端口号唯一标识互联网特定主机上的特定进程。
每一对端口号加ip地址能够唯一标识网络中一台主机上唯一的网络进程,将其称为套接字,因此所有的网络行为本质上都是进程间通信。

ipv4地址

功能:唯一标识网络上的主机
数据:无符号4个字节的整数 uint32_t
源ip地址->目的IP地址
但是对于全球43亿人来说,32个bits显然是不够的,因此采取:

  1. 谁上网给谁分配,即IP地址自动分配服务—dhcp
  2. IP地址替换—NAT(很多用户上网通过同一个路由器发送数据,因此只给路由器分配一个IP地址,传输数据时将源ip地址替换为路由器的IP地址,再由路由器分配数据)
ipv6地址

数据:无符号16个字节(128bits)
目前基本使用IPv4而不使用IPV6的原因:IPv6并不向下兼容IPv4

port端口

用于唯一标识主机上处理主机的进程(pid的标识是不固定的,每次系统重启都可能会重新分配进程pid)。
数据:无符号2个字节(0–65535)的整数 uint16_t

在网络上发送数据需要:源端口、源ip、目的端口、目的IP、协议(sip、sport、dip、dport、proto)称之为五元组,用来标识网络中的一条通信。

网络字节序

字节序:cpu对数据进行存取的顺序(存储大小大于1字节的数据)
大端字节序:低地址存高位 即低地址对应存取数据的高位,高地址存低位数据
小端字节序:低地址存低位,即低地址对应存取地位地址,高地址对应存取高位数据
主机字节序 不一定是大端/小端的,取决于cpu架构,需要判断。intel cpu的架构是x86架构,字节序是小端字节序。
若通信双方无法确定对方电脑的字节序的时候,发送大于一个字节序 存储的数据就有可能造成数据错误。因此采用解决方法:**不管主机是大端还是小端,在网络通信时统一使用大端字节序进行通信。(网络字节序就是大端字节序)**网络字节序能保证程序的可移植性。
对于大于一个字节序的数据就需要字节序转换:short int long float double

套接字编程

两台主机之间进行网络编程,必定有一方是主动方,主动发起请求,这一端就是客户端,另一端称之为服务端。客户端(主动方)---->请求---->服务端(被动方)

网络通信时,链路层使用以太网协议(eth),网络层使用ip协议,传输层使用tcp或udp协议
==(面)==传输层选择tcp还是udp?分析利弊,视使用场景而定

  • tcp(传输控制协议):有连接,可靠传输,面向字节流;确保数据能够到达对端,保证数据的安全传输,传输灵活,但是传输速率低,有粘包问题。
  • udp(用户数据报协议):无连接,不可靠,面向数据报;无法保证数据的安全传输,传输不太灵活,但是传输速度快,无粘包问题。
  • 因此对数据安全性要求高的程序使用tcp(如,文件传输),对数据的实时性要求比较高的程序用udp(如,传视频)

网络数据传送流程:网卡接收数据后,将数据放入内存的缓冲区中,每一个套接字都有一个缓冲区

scoket接口:操作系统提供的一套网络编程接口

linux下一切皆文件:
以d打头的是目录型文件
以-打头的是普通文件
以b打头的是块设备文件
以c打头的是字符设备文件
以l打头的是软链接文件
以p打头的是管道文件
以s打头的是网络套接字文件

基于udp协议的网络程序编程

客户端

  1. 创建套接字,建立与网卡的关联
  • socket(int domain,int type,int protocol)
    domain:地址域
    type:套接字类型
    protocol:
    IPPROTO_TCP:6
    IPPROTO_UDP 17
    返回值:成功:socket描述符(非负整数),失败:-1
  1. 为套接字绑定地址信息(但是对于客户端,并不推荐手动绑定,由操作系统绑定)
  • bind(int sockfd,struct sockaddr * addr,socklen_t addrlen)
    sockfd:套接字描述符
    addr:地址信息
    addrlen:地址信息长度、
    成功:0,失败:-1
  1. 发送数据sendto()
  2. 接收数据recvfrom()
  3. 关闭套接字,释放资源close()

服务端
6. 创建套接字
7. 为套接字绑定地址信息
8. 接收数据
9. 发送数据
10. 关闭套接字

基于tcp协议的网络程序编程

tcp的服务端会为,每一个客户端都建立一个新的socket,用这个新的socket专门跟客户端进行通信。一开始创建的socket,可以接收所有客户端的连接请求,一旦与客户端连接建立成功,操作系统会为客户端建立单独的socket进行数据通信。一开始的socket称之为:监听socket(仅用于建立连接),后边为每个客户端创建的socket称之为:数据传输socket(专门用于数据传输)

  • TCP的三次握手建立连接:
    调用socket, 创建文件描述符; 调用connect, 向服务器发起连接请求; connect会发出SYN段并阻塞等待服务器应答; (第一次)
    服务器收到客户端的SYN, 会应答一个SYN-ACK段表示"同意建立连接"; (第二次)
    客户端收到SYN-ACK后会从connect()返回, 同时应答一个ACK段; (第三次)

  • TCP的四次挥手断开连接:
    如果客户端没有更多的请求了, 就调用close()关闭连接, 客户端会向服务器发送FIN段(第一次);
    此时服务器收到FIN后, 会回应一个ACK, 同时read会返回0 (第二次);
    read返回之后, 服务器就知道客户端关闭了连接, 也调用close关闭连接, 这个时候服务器会向客户端发送 一个FIN; (第三次)
    客户端收到FIN, 再返回一个ACK给服务器; (第四次)

服务端:
1.创建套接字socket()
2.为套接字绑定地址信息bind()
3.开始监听(开始接收连接请求+创建队列以确定最大的并发连接数:已完成连接队列和未完成连接队列)listen();connect()
4.获取连接成功的客户端socket描述符

  • int accept(int sockfd,struct sockaddr *addr,socklen_t *addr)
    sockfd:套接字描述符
    addr:新连接的客户端的地址信息
    addrlen:地址信息长度(输入输出复合参数)
    返回值:新建立的socket的描述符

5.通过新的socket接收/发送数据(客户端已发送连接请求,因此此时谁先发送数据都可以)send/recv
6.关闭socket cose();
客户端:
1.创建套接字
2.绑定(不推荐主动绑定地址)
3.向服务端发起连接请求
4.接收/发送数据
5.关闭socket

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值