建立时 3 次握手
首先要安装 tcpdump 软件, sudo apt-get install tcpdump (用来抓包)
然后查看网卡的名字, ifconfig, 我这里网卡的名字是ens33.
然后我们再打开一个ssh链接,输入命令用来监听: tcpdump -nn -i ens33 port 80 这里我们抓的是80端口的包
然后我们打开另一个ssh链接, 输入 curl www.baidu.com 百度用的是 80 端口, 这样我们就请求一个网页, 看那边的监听情况
这是截图的结果. 不是特别明显, 还的用另一个命令 exec 9<> /dev/tcp/www.baidu.com/80
exec 只是进行TCP链接, 其中 [S] 表示链接, 正常的流程是, 需要先和baidu 建立 TCP 链接, 然后在发HTTP请求利用这个TCP链接, 然后baidu 在回复网页.
这里的 9 可以理解为是一个 socket 的代表名称, 它就代表着跟baidu 的这个socket连接.
接下来可以给百度发HTTP请求, echo -e "GET / HTTP/1.0 " >&9
然后正常来说可以通过 cat <&9 获取到返回内容. 我们可以看到返回内容(是http文件).
我们可以看到,我们命名的 9 实际上就是指向一个 socket 通信. 用的本地端口号是 34827. socket 通信是 IP+端口的通信.
socket 是什么
socket 套接字 IP,PORT + IP,PORT
使用命令 netstat -natp
连接/通信 是建立在 客户端的 IP+端口 与 服务器的 IP+端口上的. 服务器的端口是 80, 而客户端每次随机拿出一个端口号与服务器建立连接, 注意,客户端自己也是需要一个端口号的,每次连接都需要一个端口号, 使用完,自动释放这个端口号,每个机器的端口号是有限制的 65535. 所以,也就是限制了socket通信的个数。一个浏览器的多个tab页也是使用不同的端口号。
tcp协议: 面向连接的, 可靠的(靠对方确认的). 3次握手 -》数据传输 -》4次分手
3次握手:
1) 客户端 -> 服务器 发 SYN 数据包
2) 服务器 -> 客户端 发 ACK 数据包 acknowledge
3) 客户端 -> 服务器 发 ACK 数据包 acknowledge
然后, 客户端和服务器都可以分配内存资源了, 为对方服务 (这时还没发 HTTP包呢)
DDOS 攻击, 上面步骤1,2,都完成了,然后黑客修改了本地,导致客户端不发送3,而服务器在等待接收3。太多了就无法提供服务给别人了
DDOS 如何解决: 黑名单 + 负载均衡.
断开时 4 次分手
4次分手类似离婚, 因为对方会不同意
1) 客户端 -> 服务器 发FIN 数据包 finish 结束
2) 服务器 -> 客户端 ACK 数据包, acknowledge
3) 服务器 -> 客户端 发 FIN 数据包 服务器也想 finish
4)客户端 -> 服务器 发 ACK 数据包, acknowledge
详解上面截图:
我的IP是 192.168.183.130, 百度的IP 182.61.200.7 , 上面截图一共3条报文 注意 <> 左右箭头方向
1): 我给百度发请求 S 表示报文 SYN
2): 百度回给我 S. 就是 ACK的意思
3): 我回百度 . 就是我本地的 ACK 的意思. 也有百度回正式数据的含义.
现在连接建立成功. (3次握手)
然后发了一些数据包, 其中状态 P 就是真正数据用的数据包已经发送完的意思, 因为数据包有大小限制,所以可能拆分成多个数据包,比如3个,那么再发送第三个的时候就会发送 P 标记.
4次分手, F 就是 分手的标记
1) 我给百度发 F
2) 百度给我回 ack
3) 但是此时, 百度没给我回 FP, 所以客户端继续发 P 表示催促百度赶紧处理
4) 百度回 ACK
5) 我又发了一次 P
6) 百度回 ACK
7) 百度发 FP, 表示 百度也想断开了
8) 我回 ACK. 这时双方到已经得到对方确认,可以断开了.