一、TCP协议
1.1 三次握手
tcp报文格式
上面是TCP报文的结构
源端口:
目的端口:
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
六个标志位,每个标志位占1位
确认标志位 ACK:仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
终止标志位 FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
紧急标志位 URG:
复位标志位 RST:
握手过程异常情况及处理方案
第三次ACK报文丢失
如果第三个报文丢失,那么Server 端该TCP连接的状态为SYN_RECV,服务端会根据 TCP的超时重传机制,等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5.如果重发指定次数之后,仍然未收到 client 的ACK应答,那么一段时间后,Server自动关闭这个连接。
由于客户端发出第三个报文后就处于ESTABLISHED状态,此时是可以发送数据的,如果第三次ACK报文丢失,此时服务端将返回RST报文给客户端。
来源
https://www.cnblogs.com/bj-mr-li/p/11106390.html
https://www.cnblogs.com/loveLands/articles/9828841.html
MAC帧在经过路由器时,其源地址和目的地址会发生改变,路由器的目的地址会出现子在MAC帧中
帧经过交换机时,其源、目标MAC是不会变的,一句话:二层转发不改变帧的MAC地址、IP地址;
帧经过路由器时,进行路由转发,IP地址是不会变的,但MAC地址必定会变
举个例子:
A----B----C-----D 四个路由器
比如A发送报文给D,
1)A发出的是:源、目标IP是AD,源目标MAC是AB相对接口的MAC
2)B转发给C的是:源目标IP是AD,原目标MAC是BC相对接口的MAC
3)C转发给D的是:源目标IP是AD,原目标MAC是CD相对接口的MAC
D收到的帧是:源目标IP是AD,源目标MAC是CD相对接口的MAC
对帧当中的IP地址的理解:发货人、收货人
对帧当中的MAC地址的理解:
源MAC:货物中途所经过的上一个驿站
目标MAC:货物中途所要到达的下一个驿站
https://zhidao.baidu.com/question/457424520349906925.html
关闭连接过程
socket close 过程
tcp常见问题
滑动窗口RWND 和 拥塞窗口 CWND
tcp retransmission
tcp 协议(ws和timestamp选项)
tcp receive window
tcp timestamp option
四个实验,彻底搞懂tcp连接
https://blog.51cto.com/u_15067225/4334375
在浏览器中多个tab页,访问同一个网站,这些连接是否复用了?