一、Linux网络编程:Socket编程-概念

1 Socket编程-概念

1.1 套接字(socket

1.1.1 什么是socket

socket是一个编程接口,也称为套接口或套接字
socket是一种特殊的文件描述符

套接字=主机+端口号,它是计算机之间进行通信的一种约定或一种方式。通过 socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

1.1.2 协议域(domain

参数含义
AF_INETIPv4
AF_INET6IPv6
AF_LOCALUnix域

1.1.3 类型(type

类型Type作用说明
流式套接字SOCK_STREAM提供面向连接、可靠的数据传输服务,数据按字节流、按顺序收发,保证在传输过程中无丢失、无冗余。TCP协议支持该套接字。
数据报套接字SOCK_DGRAM提供面向无连接的服务,数据收发无序,不能保证数据的准确到达。UDP协议支持该套接字。
原始套接字SOCK_RAW允许对低于传输层的协议或物理网络直接访问常用于检测新的协议

1.1.4 协议(protocol

参数含义
IPPROTO_TCPTCP
IPPROTO_UDPUDP

1.1.5 五要素

  1. 协议
  2. 本地地址
  3. 本地端口
  4. 远程地址
  5. 远程端口

1.2 协议

  • 概念
    接头暗号

1.2.1 TCP(Transmission Control Protocol)

特点数据传输方式类比
面向连接数据流大巴车(人满发车,定点发车),打电话(确保信息准确送达)
1.2.1.1 TCP报文组成

TCP报文包含TCP头部和TCP数据部分
在这里插入图片描述
TCP报文头部信息有哪些,具体到各个字段?
在这里插入图片描述
16位端口号:告知主机该报文段是来自哪里(源端口Source Port)以及传给哪个上层协议或应用程序(目的端口Destination Port)的。

32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。

32位确认号:用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。

6位保留:用于后续版本长度扩充

6位标志位:
URG标志:如果这一位时1,表示紧急指针有效
ACK标志:如果为1,表示该报文为确认报文
PSH标志:表示提醒接收缓冲区已满,如果应用程序不加以处理,它们将一直在接收缓冲区中
RST标志:表示要求对方重新建立连接。带RST标记的报文段称为复位报文段
SYN标记:表示请求建立连接。带此标记为同步报文段。
FIN标志:表示通知对象本端已关闭。带此标记的报文段为结束报文段。

16位窗口大小:用于TCP流量控制。告诉对方本端还能容纳多少字节数据。

16位校验和:用于CRC循环冗余算法检验数据在传输过程中是否损坏。

16位应急指针:用于发送紧急数据

1.2.1.2 三次握手/四次挥手
  • 作用
    通信双方必须互相确定对方的存在
  • TCP连接与断开
    在这里插入图片描述
  • 报文标识
报文标识英文含义
SYNsynchronous建立连接
ACKacknowledgement确认
FINfinish结束
PSHpush传送
RSTreset重置
URGurgent紧急
  • 序列号
英文含义
Sequence number顺序号码
Acknowledge number确认号码

序列号是一个32位(bit)的随机数。用来保证传送数据包的顺序。

  • 三次握手

在这里插入图片描述
第一次握手:
客户端向服务器发送 SYN 包(SYN=1),并告诉服务器当前发送序列号(seq)为 x,客户端进入 SYN-SENT 状态。

第二次握手:
服务器接收到SYN包后,和客户端进行 ACK 应答,应答值(ack)为x+1;
同时,服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号为 y,服务器端进入 SYN-RCVD 状态;

第三次握手:
客户端收到 SYN+ACK 之后,客户端对服务器的 SYN 包应答,应答值(ack)为 y+1;此包发送完毕候,客户端和服务器端进入 ESTAB-LISHED 状态。

  • 四次挥手
    在这里插入图片描述

第一次挥手:
客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。

TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

第二次挥手:
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。

TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

第三次挥手:
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手:
客户端收到服务器的连接释放报文后,发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。

注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

在这里插入图片描述

1.2.1.3 三次握手/四次挥手面试常见问题

(1)为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

(2)为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

(3)如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

(4)如何确保数据没有损坏?
数据校验:校验和(发送的数据包的二进制相加然后取反)

(5)如何确保数据发送过去了?
确认应答:接收方收到报文会发送确认。
超时重传:发送方发送一段时间后没收到确认会重新发送。

(6)如何确保数据及时到达?
流量控制:当接收方来不及处理发送过来的数据,能提示发送方降低发送的速率,防止包丢失。
拥塞控制:当网络拥塞时,发送方会减少数据的发送。

(7)TCP如何实现可靠性?
1)准确:连接管理(三次握手四次挥手)
2)安全:数据校验、确认应答、超时重传
3)迅速:流量控制

1.2.1.4 什么时候使用TCP

例:下载文件
数据完整性要求高
数据可靠性要求高
传输性能要求低

1.2.2 UDP(User Datagram Protocol)

  • 结构
    UDP报文:
    在这里插入图片描述
    UDP首部:
    在这里插入图片描述

  • 特点

特点数据传输方式类比
无连接数据报出租车(随到随走),发短信(不是关心对方马上收到)
  • 分类
分类举例
单播(unicast)私聊,爱奇艺视频
广播(broadcast)广告,病毒
多播/组播(multicast)群聊,春晚直播

在这里插入图片描述

  • 区别

在这里插入图片描述

1.2.3 TCP 和 UDP 区别:

(1)连接
TCP 是面向连接的传输层协议,传输数据前先要建立连接。
UDP 是不需要连接,即刻传输数据。

(2)服务对象
TCP 是一对一的两点服务,即一条连接只有两个端点。
UDP 支持一对一、一对多、多对多的交互通信

(3)可靠性
TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按需到达。
UDP 是尽最大努力交付,不保证可靠交付数据。

(4)拥塞控制、流量控制
TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。
UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率。

TCP 和 UDP 应用场景:
(1)由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
FTP 文件传输;
HTTP / HTTPS;
(2)由于 UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:
包总量较少的通信,如 DNS 、SNMP 等;
视频、音频等多媒体通信;
广播通信;

1.3 路径

1.3.1 IP

IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网际层协议。
Internet中主机的标识

1.3.1.1 分类

32位(IPV4)/128位(IPV6)

1.3.1.2 表示形式

常用点分形式

协议形式e.g.
IPv4点分十进制192.168.0.1
IPv6点分十进制::192.168.0.1
IPv6点分十六进制::C0A8:0001
1.3.1.3 举例
IP地址地址类型作用
0.0.0.0通配地址主机上所有IP,多网卡共用
127.0.0.1回环地址本地虚拟接口,无网卡可用,检查本地网络协议
255.255.255.255广播地址受限广播地址,当前路由器均不转发此类广播
XXX.XXX.XXX.255广播地址子网广播地址
XXX.XXX.255.255广播地址全子网广播
224.0.0.0~239.255.255.255组播地址详细参见组播地址分类

1.3.2 端口

端口的作用:区分一台主机接收到的数据包应该转交给哪个进程来进行处理
查看端口:netstat –apn

1.3.3 类比

IP与端口
火车站与站台
飞机场与登机口
公司与办公室
银行与窗口柜台

1.4 字节序

类型简写本质e.g.
大端BE(big endian)将高序字节存储在起始地址IBM、网络
小端LE(little endian)将低序字节存储在起始地址Intel

查看当前CPU支持的字节序:lscpu

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值