Linux下的网络通讯

UDP:用户数据报协议 传输层

特点:

1.无连接

2.不安全、不可靠

3.面向报文

4.占用资源开销小

TCP : 传输控制协议 传输层

  1. TCP特点:

1.面向连接

2.安全、可靠

3.面向字节流

4.占用资源开销大

三次握手:

指建立tcp连接时,需要客户端和服务端总共发送三次报文确认连接。

四次挥手:

断开一个tcp连接,需要客户端和服务端发送四个报文以确认断开。

  1. 编程模型

client: socket--->connect--->send/write--->close

server: socket--->bind--->listen--->accept---> recv/read--->close

  1. 函数接口:

1.socket

socket(AF_INET, SOCK_STREAM, 0);

2.connect

int connect(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

功能:

发送三次握手链接请求

参数:

sockfd:套接字文件描述符

addr:存放目的地址空间首地址

addrlen:目的地址长度

返回值:

成功返回0

失败返回-1

3.send

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

功能:

发送数据

参数:

sockfd:套接字文件描述符

buf:存放数据空间首地址

len:数据长度

flag:属性默认为0

返回值:

成功返回发送字节数

失败返回-1

4.recv

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

功能:

接收数据

参数:

sockfd:套接字文件描述符

buf:存放数据空间首地址

len:最多接收数据长度

flags:接收属性默认为0

返回值:

成功返回实际接收字节数

失败返回-1

连接断开返回0

5.bind

int bind(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

6.listen

int listen(int sockfd, int backlog);

功能:

监听三次握手链接请求

参数:

sockfd:套接字文件描述符

backlog:最多允许等待尚未处理的三次握手链接个数

返回值:

成功返回0

失败返回-1

10.accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:

处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字

参数:

sockfd:套接字文件描述符

addr:存放发送端IP地址空间首地址

addrlen:想要接收的IP地址的长度

返回值:

成功返回新文件描述符

失败返回-1

  1. TCP粘包问题

TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题。

粘包问题出现的原因:

  1. 发送端:需要等缓冲区满时才发送出去,造成粘包;

  2. 接收端:不及时的接收缓冲区内的包,造成多个包接收。

避免粘包问题的方法:

  1. 对于定长的包,保证每次都按固定大小读取即可;// 结构体

  2. 对于变长的包,还可以在包和包之间使用明确的分隔符,这个分隔符是由程序员自己来定的,只要保证分隔符不和正文冲突即可。

  3. TCP报文头

标志位:

  1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。

  2. ACK: 确认应答标志

  3. PSH: 表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间

  4. RST: 重置连接标志

  5. SYN: 表示请求建立一个连接

  6. FIN: finish标志, 表示释放连接

滑动窗口大小:是TCP流量控制得一个手段。目的是告诉对方, 本端得TCP接受缓冲区还能容纳多少字节得数据,

这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.

  1. TCP的机制:

TCP复杂是因为它既要保证可靠性,同时又要尽可能的提高性能。

可靠性:

(1)三次握手和四次挥手机制

(2) 确认应答:TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,保证数据不丢失的按序到达

(3)超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。

(4)流量控制:按照ACK中"窗口大小"字段控制发送端的发送速度

提高性能:

(1)滑动窗口:可以按照"窗口大小", 一次发送多条后, 再等待应答。

(2)延迟应答:当接收方处理速度很快时,可以延迟发送ACK,此时"窗口大小"会自动增大

(3)捎带应答:搭载应用层的响应报文发送ACK。

=======================================================================

相关推荐
Tassel_YUE1 小时前
网络自动化04:python实现ACL匹配信息(主机与主机信息)
网络·python·自动化
hjjdebug1 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯1 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流1 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩1 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布1 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花1 小时前
第六章:DNS域名解析服务器
运维·服务器
Spring_java_gg1 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
✿ ༺ ོIT技术༻1 小时前
Linux:认识文件系统
linux·运维·服务器
恒辉信达1 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql