概述
- 传输层对传输行为进行控制,是一种逻辑连接(状态)。传输层(TCP)可以进行流量控制、拥塞控制、重传等。
- 网络层提供了主机到主机的通信,将传输层产生的数据包封装成分组数据包发送到目标主机,并提供了路由选择的能力。
TCP协议简介
- TCP是一个可靠的、面向连接的、基于字节流的、全双工的协议。
- TCP可靠的因素:校验和(数据完整和正确)、序列号(乱序和重复)、确认+重传。
- TCP是字节流协议,流是没有固定的报文边界。应用层可以用特殊字符标志数据结束或加入含有数据长度的头。
- TCP全双工通信,双方可以同时收发。
TCP协议首部字段
-
首部字段
-
三次握手
-
序列号:
通过算法,随机生成。不是从0开始。 -
确认号
告知对方下一个期望接收的序列号,小于此序列号的所有字节已经收到。 -
关于ack
- 不是所有的包都需要确认的。
- 不是收到了数据包就立马需要确认的,可以延迟一会再确认。(delay ack)
- 确认号永远是表示小于确认号的字节都已经收到。
-
窗口大小(window size)
2字节,64k。但实际使用中可能不够,所以引入了窗口缩放(Window scale)的概念,来让窗口大小变大。
计算后的window size为1025 * 256 = 262400 -
mss最大报文段
在tcp头部的选项字段内。 -
测试对方端口是否打开
- telnet 192.168.20.10 5236
- nc -v 192.168.20.10 9876
-
查看端口占用
- netstat -ltnp | grep :22
- lsof -n -P -i:22
- ss -lntp | grep 22
-
什么情况分配临时端口:
- 调用bind函数,但指定端口号为0。
bind(0) - 没有调用bind,直接调用connect。
- 调用bind函数,但指定端口号为0。
-
TCP协议栈用全局的3个哈希表inet_hash
- ehash:负责有名有姓的socket,即四元组(源、目的ip,源、目的端口)明确的socket,key由源地址、源端口、目标地址、目标端口组成;
- bhash:负责端口分配,key是端口号,value是使用此端口的所有socket,一个socket可以同时在bhash和ehash中。
- listening_hash:负责listen socket。
在文件/net/inet_hashtables.h中struct inet_hashinfo。
-
connect 优先使用偶数端口号。偶数都用了的情况再分配奇数的端口号。
协议栈测试工具 packetdrill
先略


