TCP协议传输层有发送缓冲区和接收缓冲区
read,recv,send的函数调用发送缓冲区,本质并不是数据发送到网络当中,数据什么时候发送,发送多少,出错了怎么办,由TCP协议自主决定
发送到对方缓冲区本质上是拷贝
全双工:既能读又能写,原因是因为有两个文件缓冲区
udp 没有发送缓冲区,直接发送
报头和有效载荷如何分离,如何交付给上层
报头20个字节
4位首部长度 [0000,1111]=[0,15] =>[0,60]除了长度大小还有选项
基本单位是4个字节
首部长度-20个字节剩下的40个字节是选项
16位窗口大小:
流量控制:规避客户端发送大量数据导致服务端接收缓冲区满了,产生大量丢包
TCP保证可靠性,最基本的一个特点,确认应答机制
发送后,发送端接收到发送端的确认应答机制
发送方的流量控制,由接收方剩余空间大小决定,16位窗口大小是发送方接收缓冲区剩余空间大小
因为是全双工的,双方可以根据对方的报文来确定流量控制。
32位序号和32位确认序号
收到应答,最近发送的消息对方收到了,最新的消息是没有应答的,无法保证
tcp最原始的通信过程,不再对应答发送二次应答
客户端一段时间如果没有收到应答,会对信息进行重传
将应答和tcp数据合在一起发送
序号作用一:保证报文按序到达,或者乱序到达后,能排好序
序号是什么
从用户层拷贝下来时,连续的字符串被拆成多个字节,天然每个字节都有自己的序号,本质是数组下标
序号就是报文数据的最后一个下标,根据序号来重新组合发送的数据
确认序号是对收到的报文序号+1,表示确认序号之前的数据已经收到
下次发送请从确认序号+1字符开始发送
可以允许应答有少量丢失,即使前面应答有少量丢失,也可以根据后面的应答来确定前面是否收到。
为什么有两个序号?原因一:既可能是应答也是同时发送数据。
一个服务器可能会给多个服务端服务。
6个标志位的意义
服务器发送的tcp报文有五种类型:三次握手,四次挥手,通信的正常报文,一共有五种类型。
有系统调用改变标识位
ACK:确实位是否有效
SYN:请求建立连接,我们把携带syn的标志位称为同步报文段
在三次握手时用到
FIN:通知对方,本端要关闭
PSH:当接收缓冲区已满时,发送方的会设置PSH表示位为1,发送报文,让接收方把tcp缓冲区读取数据读走
RST:对方要求重新建立连接。我们把携带RST标识的称位复位报文段
作为服务端会存在同时存在多个已经建立好的链接,理解链接的概念,操作系统为链接建立结构体
(最后一个ack没有应答,客户端不知道服务端是否收到),client只要把第三次的ack发送过去,就认为建立好
然而当ack发送失败,服务端要发送rst标志位的报文,提醒客户端重新建立连接
urg标志位:紧急指针是否有效
数据插队,优先读取某些重要数据,urg为0紧急指针无效,urg为1,紧急指针有效,紧急数据为数据中紧急数据的偏移量,紧急数据一般为一字节,一般一个报文只有一个紧急数据
场景:当服务器出现问题,发送紧急数据,询问服务器情况,服务器返回紧急数据给客户端
确认应答ACK机制
超时重传机制
主机对于发出的报文是否丢失,无法判定
接收端可能收到重复报文,通过序号去重
超时时间如何确定?
超时时间和网络有关,是动态的而且和网络状态强相关
在linux以500ms为单位控制,且指数增加
如第一次 2*500ms 第二次 4*500ms
tcp的链接管理机制
connect负责发起三次握手,establish connect返回
accept不发起握手,会把发起的链接拿上来
closefd(fd) 发送断开连接tcp报文
tcp通信是基于链接的,是三次握手和四次挥手
保证客户端和服务端至少有一次收和发,验证全双工通路是否通畅
一次握手可能导致syn洪水,客户端多次发送syn请求
两次握手:优先让server做出连接建立动作
三次握手:奇数次握手保证连接失败是在顾客端的
四次挥手:确保双方都知道对方不想发送数据
在FIN_WAIT_2客户端不想再发送数据