波奇学Linux:TCP协议

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客户端不想再发送数据

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-02 10:48:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-02 10:48:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-02 10:48:02       82 阅读
  4. Python语言-面向对象

    2024-04-02 10:48:02       91 阅读

热门阅读

  1. Spring boot如何使用redis缓存

    2024-04-02 10:48:02       33 阅读
  2. 【微机原理实战笔记】浅入理解汇编源文件

    2024-04-02 10:48:02       33 阅读
  3. 详细需求的拆解

    2024-04-02 10:48:02       33 阅读
  4. appium用例参数化

    2024-04-02 10:48:02       36 阅读
  5. 探索Django:打造高效、可扩展的Web应用(中)

    2024-04-02 10:48:02       42 阅读
  6. ES6中的解构赋值

    2024-04-02 10:48:02       35 阅读
  7. 2404d,d取参数标识元组

    2024-04-02 10:48:02       36 阅读