TCP协议的特点
TCP协议是有序的、面向连接的、可靠的字节流传输层协议
什么是字节流
字节流的意思就是说,将数据分组发送时,分组数据的大小可以以字节为单位进行调整
注:
为什么要调整分组数据的字节数
当网络状况不好,如果你还拼命的发送字节数很大的分组数据时,出错的可能性很高
所以进行TCP通信时,如果TCP检测到网络不佳时,就会减少分组数据的字节数(把分组数据变小),
网络状况好转时再逐步增加字节数,总之会根据网络的好坏来调整字节数,这个调整的机制被称为
“滑动窗口机制”
滑动窗口机制
1)当网络不好导致数据丢失时,数据每丢失一次,分组字节数减为以前的二分之一
比如原本1000字节,现在变为500字节。
2)当网络状态恢复时
1)如果目前分组大小 < 最初大小的二分之一时,每成功发送一个字节,字节数增加1倍
2)如果目前分组大小 >= 最初大小的二分之一时,每成功发送一次,分组字节数只增加1字节,增加减缓了
UDP
DUP跟TCP不一样的,UDP的分组数据包是固定长度的数据报,并不会根据网络的好坏来进行调整
TCP协议为什么是可靠传输协议
通过三点来保证:
第一:三次握手建立连接
第二:有应答机制,也就是将数据发送给对方后,对方必须应答是否发送成功
第三:使用“滑动窗口”机制,根据网络的好坏,控制发送的分组数据的大小
三次握手建立连接和四次挥手断开连接示意图
第一次握手
客户端向服务器发送一次请求
第二次握手
服务器向客户端回消息,表示收到请求
第三次握手
客户端回复服务器,"我知道了"
![三次握手](https://i-blog.csdnimg.cn/blog_migrate/f6f5b59464c9447c6d505905edd94731.png)
TCP 编程模型
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d78692f5948ba05baf5bebcab2665ab6.png)
协议族
socket函数
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
domian指定协议族
你要使用的通信协议一定是属于某个协议族
type套接字类型
说白了就是进一步指定,你想要使用协议族中的那个子协议来通信
type的常见设置值:SOCK_STREAM、SOCK_DGRAM、SOCK_RDM、SOCK_NONBLOCK、
SOCK_CLOEXEC SOCK_STREAM
protocol:指定协议号