网络协议分析-TCP(上)
TCP:
TCP特点:
1. 面向数据流
2. 虚链路连接
3. 有缓冲的传输
发送方和接收方都有一个固定大小的缓冲空间。
4. 无结构的数据流
TCP流服务并不提供结构化的数据流形式。
5. 全双工连接
TCP流服务提供的连接功能是双向的,连接的任一方都能够发送和接收数据。
TCP连接建立:
TCP 连接的建立是基于客户端/服务器模式。TCP使用三次握手来建立连接。
TCP三次握手具体步骤:
- 客户端发送SYN报文段,指明客户端打算连接的服务器端口以及初始序号(x)。
- 服务器发送包含服务器初始序号(y)的SYN报文段作为应答,并包含确认信息(ACK),告诉客户端自己已收到第一个SYN报文,并且同意建立这个连接。确认号被设定为初始序号+1(x+1),并期望收到下一个SYN。
- 客户端将确认号设置为服务器的初始序列号+1(y+1)以对服务器SYN报文进行确认,通知目的主机已成功建立了双方所同意的这个连接。
三次握手的功能:
- 同意连接协商,确保双方做好传输数据的准备。
- 协商各自报文段初始序列号
- 协商最大报文段长度(只有SYN报文才能协商该参数)
初始序列号的选取:
TCP规定初始序列号不能为1,由于TCP是全双工的,所以每个方向上报文的初始序列号都要在三次握手阶段通告给对方。
TCP初始序列号不为1的原因是为了防止安全性攻击。
取值方法:
ISN=M+F(localIP,localport,remoteIP,remoteport,secretkey)
其中M是一个计时器,每隔4毫秒+1,F是一个散列算法,secretkey是一个秘密值。这样就使得ISN是一个小于2^32的随机整数,且随时间增长而增大,到2^32后再回滚。安全性增强。
MSS协商:
TCP通过三次握手建立连接的过程中可协商MSS。每个TCP报文是以不同长度在一个连接上传输的,因此一个连接的两端必须协商一个最大的报文长度值。
如果连接的两端处于同一个物理网络中,TCP协议会计算合适的MSS,使得数据报大小与网络的MTU近似。如果不在同一个物理网络,他们就会把路径上最小的MTU作为MSS,默认值为536字节。
TCP连接的关闭:
TCP使用改进的三次握手方法关闭连接。首先进行关闭的一方执行主动关闭,而另一方则执行被动关闭。
TCP四次挥手具体步骤如下:
- 进行关闭的一方在发送完全部数据并等待确认全部到达后,发送一个FIN报文。
- 当另一方收到这个FIN后,先发回一个确认ACK,确认号为收到的序号+1,同SYN一样,一个FIN报文也占用一个序号。同时通知应用程序,通信结束,后续没有任何数据了。
- 当应用程序处理完毕后,关闭它的连接,向主动关闭的一方,发送FIN报文字段。
- 关闭发起的一方,发送最后一个ACK,将确认序号设置为收到的序号+1。
TCP连接异常关闭:
TCP使用连接复位操作来执行异常关闭,发起端送出一个RST报文,此时连接双方立即停止传输,关闭连接,并释放所用的缓冲区等有关资源。
TCP半开连接检测:
半开连接产生的原因:
- 进程崩溃:如果一个进程正常关闭,通常会发送一个“FIN”包,通知对方连接已经关闭。但是,如果进程崩溃或终止(例如,从任务管理器终止),对对端的“FIN”通知是不能保证发送的。操作系统有可能代表崩溃的进程发送一个“FIN”数据包;不过,这取决于操作系统。
- 电脑死机:如果整个计算机(包括操作系统)崩溃或断电,肯定无法通知对方连接已经断开。
路由器崩溃/重启。客户端和服务器连接之间的任何路由器也可能崩溃或重启;如果此时一方正在发送数据,则会导致连接中断,发送方的连接断开。如果在此期间双方没有数据发送,那么连接不会断开。
- 拔掉网络电缆:客户端和服务器连接之间的网络电缆断开都会导致连接中断而不通知。这与路由器的情况类似;如果在电缆断开到接通期间,没有数据正在传输,则连接实际上不会丢失。但是,计算机通常会检测是否拔掉了特定的网络电缆,并且可能会通知其本地套接字网络丢失(远程端不会被通知)。
- 无线设备(包括笔记本电脑)超出范围:移出接入点范围的无线设备将失去连接。这是一个经常被忽视但日益普遍的情况。
服务器对每条连接都要维护相应的记录,这需要耗费内存空间,如果客户端异常关机,那么就没有必要再维护这条连接记录了。为了解决这个问题,TCP引入了保活计时器,一旦服务器发现某条连接上已经有2小时没有通信了,便会向客户端发送探查报文并根据情况进行处理:
正常工作并且从服务器可达:
发送探查报文,如果收到回应,便重置保活计时器,重述上述过程
客户端崩溃:
连续发送10个探查报文,回应超时时间间隔设置为75秒,若始终没有回应,则终止连接。
客户端崩溃后重新启动:
此时客户端会向服务器发送RST报文,服务器收到这个报文后终止连接。
TCP报文格式:
TCP报文格式源端口,目的端口:各占2字节,包含连接双方用于表识进程的端口号。
序列号:占4字节,TCP为每个报文赋予一个序号,指明双方在发送的数据字节流中的位置。
确认号:占4字节,表示的是期望收到对方下一个报文的序号。
首部长度:占4bit 是以4字节为单位的首部长度值。
保留未用:6bit 固定为0
窗口:占2字节,用于指定缓冲区大小,以字节为单位。
码元比特:
URG:紧急指针字段有效,表示该报文段中有紧急数据,尽快发送
ACK:表示报文段中携带了确认信息。
PSH:表示本报文段中请求推操作来强迫数据发送。
RST:表明TCP连接中出现严重错误偏差,必须释放连接。
SYN:在建立连接时使用。
FIN:在结束连接时使用。
TCP校验和:TCP首部校验和占2字节,提供包括TCP首部在内全部数据完整性校验。
TCP选项:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,那么选项部分最长为:(2^4-1)*4-20=40字节。
具体有:
MSS、窗口扩大因子、选择性确认、时间戳、MD5签名、认证
图侵删
欢迎指出文章中的错误,谢谢