《Linux高性能服务器编程》读书笔记之tcp协议详解
来源:互联网 发布:会计网络在线课程 编辑:程序博客网 时间:2024/05/22 03:13
1.TCP头部结构
TCP头部结构如下图所示,其中的诸多字段为管理TCP连接和控制数据流提供了足够的信息。
16位端口号:告诉主机该报文段是来自哪里以及传给哪个上层的协议或应用程序(目的端口)的。
32位序号:一次TCP通信过程中某个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。
32位确认号:用作对另一方发送来的TCP报文段的相应。其值是收到的TCP报文段值加一。
4位头部长度:标识该TCP头部有多少个32bit。
16位窗口大小:是TCP流量控制的一个手段。告诉对方本端的TCP接受缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
2.TCP连接的建立和关闭
用tcpdump抓取TCP三次握手与四次挥手的报文如下:
图示如下:
TCP连接是全双工的,所以它允许两个方向的数据传输被独立关闭。也就是说,通信一方可以发送结束报文段给对方,告诉它本端已经完成了数据的发送,但允许继续接受来自对方的数据,直到对方也发送结束报文以关闭连接,TCP称这种状态为半关闭状态,如下图所示:
socket网络编程接口shutdown函数提供了对半关闭的支持。当调用close()函数时,表示读写同时关闭,这时两端同时关闭socket连接。当调用shutdown时,可以指定只关闭写,此时进入到半关闭状态。
3.TCP状态转移
主动关闭TCP连接的一方在接收对方的结束报文段后,并没有直接进入到CLOSED状态,而是转移到TIME_WAIT状态。这个状态,一般持续2MSL(Maximum Segment Life,报文段最大生存时间)的时间,才能完全关闭。这么做主要是保证对方能收到对结束报文段的ACK,确保网络能可靠的终止。我们可以通过socket选项SO_REUSEADDR来强制进程立即使用处于TIME_WAIT状态的连接占用的端口。
4.复位报文段
有三种情况会使TCP连接的一端向另一端发送携带RST标志的报文段。
(1)访问不存在的端口
当客户端程序访问一个不存在的端口时,目标主机将给它发送一个复位报文段。
(2)异常终止连接
TCP提供了一个异常终止连接的方式,即给对方发送一个复位报文段。一旦发送了复位报文段,发送端所有排队等待发送的数据都将被丢弃。
(3)处理半打开连接
TCP的一端关闭或异常终止了连接,而对方没有收到结束报文,此时另一端还维持着原来的链接。我们称此时的状态为半打开状态。如果此时往处于半打开状态的连接写入数据,则对方会回应一个复位报文段。
5.TCP超时重传
TCP为每个TCP报文都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到对方的应答,TCP模块将重传TCP报文段并重置定时器。一般超时一次,TCP定时器的时间会翻一倍。最多重传的次数由内核的参数给出。
- 《Linux高性能服务器编程》读书笔记之tcp协议详解
- Linux 高性能服务器编程——TCP协议详解
- linux高性能服务器编程学习笔记一:TCP/IP协议详解
- linux高性能服务器编程学习笔记三:TCP协议详解
- Linux 高性能服务器编程——IP协议详解
- 《linux高性能服务器编程》读书笔记
- Linux网络编程【五】:TCP协议高性能服务器(http)模型之I/O多路转接select
- Linux网络编程【六】:TCP协议高性能服务器(http)模型之I/O多路转接epoll
- Linux网络编程【七】:TCP协议高性能服务器(http)模型之I/O多路转接poll
- Linux 高性能服务器编程——TCP/IP协议族
- linux高性能服务器编程之同时处理UDP请求和TCP请求的服务器
- linux高性能服务器编程学习笔记二:IP协议详解
- Linux服务器高性能编程——读书笔记(一)
- Linux服务器高性能编程——读书笔记(二)
- Linux服务器高性能编程——读书笔记(三)
- Linux服务器高性能编程——读书笔记(四)
- Linux服务器高性能编程——读书笔记(五)
- 【Linux网络编程】基于TCP协议 I/O多路转接(select) 的高性能回显服务器客户端模型
- 1016. Phone Bills (25)
- 将excel中数据导入到mysql数据库
- 4.19
- sql server 结束指定数据库所有进程
- C#创建DataTable
- 《Linux高性能服务器编程》读书笔记之tcp协议详解
- mysql基本建表
- 4.20
- latex写的简历如何转换成word或者HTML
- textview设置 weight
- Struts2教程8:拦截器概述
- 如何快速枚举局域网内所有存活主机IP
- Tomcat 配置隐藏根目录
- WPF 4.5和C#(3.3)——布局(Grid)