备注:seq为sequence(序列),ack(响应)
TCP/IP协议栈:
TCP:面向连接(打电话:先建立连接,如果不通,又要重新开启连接)UDP:非面向连接(发信息,不知道对方是否收到)
源端口号:发送TCP进程对应的端口号
目标端口号:目标端接收进程的端口号
32位序列号/确认号(可靠传送):0~2^32-1范围内,数据段标记,用于到目的端对到达包的重组
TCP顺序号/确认号 顺序号:数据内容的第一个byte的序号,也可以知道尾部的byte的序号
4位首部长度:TCP包头的长度(可变,一次有保留位) 5个表示位:URG【紧急指针有效位(告诉接受方有紧急数据),常与16位紧急指针(紧急数据在哪里)配合用】 ACK:确认序列号有效位,表明该数据包包含确认信息(32位序列号)(几乎多数数据包都有此位) PSH:通知接收端立即将数据提交用户进程,不在缓存中停留等待更多数据 RST:为1时,请求马上断掉连接(不通过4次握手) SYN:为1时,请求建立连接(通过三次握手) FIN:为1时,数据发送完毕,请求断开连接 16位窗口大小:滑动窗口的大小,指明本地数据可接收数据的字节数(涉及流控机制、拥塞控制机制,保证可靠传输)。指通讯双方的接收缓存的大小。 16位校验和:类似MD5值 可选项:导致包头长度无固定(因此需要保留位) 常见端口号(1~1024): 使用TCP传输:【ftp:21 telnet:23 smtp:25 dns:53】 使用UDP传输:【tftp:69 snmp:161 RIP:520】 DNS有时通过TCP,也可以通过UDP http:80 ssh:22 https:443
tcp三次握手:
SYN或FIN一旦为1,都会占用一个序列号 (seq:起始序列号) 三次握手过程: 1.发送方:发送一个SYN包,SYN置为1(seq=100,ctl=SYN) 2.接收方:接收;发送SYN,ACK(seq=300,ack-101,ctl=syn=1,ack=1) 3发送方:接收syn。建立会话(seq=101,ack=301,ctl=ack) 建好TCP链接
(ps:除了建立连接的第一个SYN报文,其他的包都有ACK置为1)
tcp四次断开: A:seq=100 B:seq=300 A:ACK=101 A:发送FIN请求断开(seq=101,ack=301,ctl=FIN,ACK=1) B:发送ACK(seq=301.ack=102,ctl=ACK)(没有数据,只有ACK不占用序列号);发送FIN,请求断开(seq=301,ack=102,ctl=FIN,ACK)【两者的起始序列号一样】 A:发送ACK(seq=102,ack=302,ctl=ACK)
TCP流控机制:
接收方的缓冲区决定了发送方可以一次发送多少数据, 接收方和发送方都各自向对方汇报缓冲区大小 判断丢包: 计时器:超时前接收方必须说明已收到,否则重发
如果接收方三次发送同样的ACK,发送方就会根据ack发送合适的包(之前遗失的)给接收方