TCP

一、TCP特点

  1. 面向连接的协议,在传输数据前需要建立一条可靠连接

  2. 流式协议,TCP将数据看作字节流。传输过程中数据是可以被分割为多个数据包在接收端重新组装的。

  3. TCP通过校验和\序列号和确认应答来确保数据的可靠传输,出错回重新传输。

  4. 服务器被动连接,客户端主动连接。

二、TCP编程

server端

1.创建套接字socket()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

功能:
创建一个套接字,返回一个文件描述符
参数:
domain:通信域,协议族
AF_UNIX 本地通信
AF_INET ipv4网络协议
AF_INET6 ipv6网络协议
AF_PACKET 底层接口
type:套接字的类型
SOCK_STREAM 流式套接字(tcp)
SOCK_DGRAM 数据报套接字(udp)
SOCK_RAW 原始套接字(用于链路层)
protocol:附加协议,如果不需要,则设置为0

返回值:
成功:文件描述符
失败:‐1
2.绑定套接字bind()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <sys/types.h>

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
将套接字与网络信息结构体绑定
参数:
sockfd:文件描述符,socket的返回值
addr:网络信息结构体
通用结构体(一般不用)
struct sockaddr
网络信息结构体 sockaddr_in
#include <netinet/in.h>
struct sockaddr_in
addrlen:
addr的长度
返回值:
成功:0
失败:-1
3.监听套接字listen()
1
2
3
4
5
6
7
8
9
10
11
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
将套接字设置为被动监听状态,这样做之后就可以接收到连接请求
参数:
sockfd:文件描述符,socket函数返回值
backlog:允许通信连接的主机个数,一般设置为510
返回值:
成功:0
失败:-1
4.接收连接accept()
1
2
3
4
5
6
7
8
9
10
11
12
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
阻塞等待客户端的连接请求
参数:
sockfd:文件描述符,socket函数的返回值
addr:接收到的客户端的信息结构体(自动填充,定义变量即可)
addrlen:addr的长度
返回值:
成功:新的文件描述符(只要有客户端连接,就会产生新的文件描述符,这个新的文件描述符专门与指定的客户端进行通信的)
失败:-1
5.通信recv()/send()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <sys/types.h>

#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
接收数据
参数:
sockfd:文件描述符
客户端:socket函数的返回值
服务器:accept函数的返回值
buf:保存接收到的数据
len:buf的长度
flags:标志位
0 阻塞
MSG_DONTWAIT 非阻塞
返回值:
成功:接收的字节数
失败:-1
如果发送端关闭文件描述符或者关闭进程,则recv函数会返回0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

功能:
发送数据
参数:
sockfd:文件描述符

客户端:
socket函数的返回值
服务器:
accept函数的返回值

buf:发送的数据
len:buf的长度
flags:标志位
0 阻塞
MSG_DONTWAIT 非阻塞

返回值:
成功:发送的字节数
失败:-1
6.关闭套接字()

client端

1.socket()
2.connect()
1
2
3
4
5
6
7
8
9
10
11
12
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
给服务器发送客户端的连接请求
参数:
sockfd:文件描述符,socket函数的返回值
addr:要连接的服务器的网络信息结构体(需要自己设置)
addrlen:add的长度
返回值:
成功:0
失败:-1
3.send()/recv()
4.close()

三、OSI模型

应用层 HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP、等等
表示层 XDR、ASN.1、SMB、AFP、NCP、等等
会话层 ASAP、SSH、RPC、NetBIOS、ASP、Winsock、BSD Sockets、等等
传输层 TCP、UDP、TLS、RTP、SCTP、SPX、ATP、IL、等等
网络层 IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25、等等
数据链路层 以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP、等等
物理层 例如铜缆、网线、光缆、无线电等等

image-20241124204619077

DTLS

1.1DTLS特点作用

DTLS: 是一种面向无连接的协议,基于 UDP作用为给UDP提供端到端的安全通道,就像SSL/TLS对TCP的作用一样。

SSL/TLS协议是基于TCP socket,利用加密、基于数字证书的身份验证等机制在传输层和应用层之间构建了一个端到端的安全通道,保证了传输数据的加密性。

没用到,用到再来补充