TCP/IP:三次握手和四次挥手
Linux的一些网络命令:模板:指令 参数
type 指令:查看指令的类型
1、exec() 22<>(大于和小于号表示输入输出,重定向) /dev/tcp/www.baidu.com/80(path,一个路径这个路径是百度服务器的文件,即一切皆文件,和一个端口号)
其实就是船舰一个socket通信,通信怎么建立的归属于内核
exec 22<&- 关闭
22是到百度的输入输出流。
通过文本表现的方式,与百度服务器端口中建立了一个连接。通信就是建立连接,具体的细节后面介绍。连接有了,可以发送命令了,需要一个语言交流,所以就需要协议。
2、echo(发送一个字符串) “GET(方法) /(资源的地址) HTTP/1.0(版本号)\n(用换行符做split)”
这里就是一个HTTP协议的请求
echo -e “GET / HTTP/1.0\n” //这里是打印到屏幕,为了发送给百度需要重定向到
echo -e “GET / HTTP/1.0\n” 1>&(这是重定向的一个操作) 22(就是一个抽象的通道)
百度就会收到这个字符串。
3、cat 0<& 22 //将百度回应的信息重定向到0这个通道打印出来
4、route -n 查看路由信息
5、netstat -natp 查看网络信息,能查找到socket的四元组,状态有很多
6、lsof -p $$查看TCP连接状态
7、curl www.baidu.com这个命令包含了上面的过程(包括连接)
TCP建立连接:
建立连接相当于在客服端与服务器端分别都要开辟资源,也就是为了到来的传输资源开辟存储资源的内存buffer,相当于new,三次握手的连接方式:
三次握手其实就是c和s端分别确认自己的输入和输出能用。
例如:第一次:c发送SYN(报文段也是就是一个数)发送到s(注意这里c并不能确认自己的输入输出能否用,只有当收到s的回应之后才能确认发送和接受成功,此时s确认自己的输入能用,但不确认输出是否能用,所以就发送一个ACK(acknowledge)信号,这一这个值等于syn+1,以便于c能识别)
第二次:s发送ack给c(这是已经能确认c的输入输出能用了,但是s的输出是否能用,还得等待回应,所以c还得发送一个ack给s,ack同样是加1)
第三次:c发送ack给s
在C++中,我们申请了内存需要释放,所以同理在申请了资源缓冲区那就也得释放。首先解释一下socket(套接字),这里的“套”:ip+port : ip+port(解释就是四元的,也就是c的ip地址和端口号对应的s的ip地址和端口号)
TCP:四次挥手
断开其实就是双方同时释放资源,而不是单方释放资源。
第一次:c发送(FIN(finish))给s,表明字节准备断开连接,释放资源了,再等待s回应
第二次:s发送(ACK)给c,表明同意对方释放资源。
第三次:因为需要双方都释放资源所以s也需要释放,那么重复上面;s发送(FIN(finish))给s,表明字节准备断开连接,释放资源了,再等待c回应
第四次:c发送(ACK)给s,表明同意对方释放资源。
演示:
通过网络抓包的方式。用于获取网络数据包的发送和接收的顺序。
tcpdump(抓包的软件)-nn(不要显示一些内容) -i(抓的那台网卡)eth0 port(数据包的端口号)
网卡可用ifconfig查找到
抓包结果分析:
(1)listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
表示正在监听,准备抓包
(2)17:16:47.042490 IP 192.168.141.128.58708 > 23.32.241.160.80: Flags [S], seq 1084883911, win 29200, options [mss 1460,sackOK,TS val 49641 ecr 0,nop,wscale 7], length 0
这个包表示:本机的ip地址的任意一个端号,发动给百度的服务器ip端号80一个包,Flag(s)表示S标志位(SYN1),表示第一个握手的包;length大小为0,表示不传输数据,只是一个传输控制的包。发给百度一个想握手的控制包。
(3)17:16:47.127675 IP 23.32.241.160.80 > 192.168.141.128.58708: Flags [S.], seq 348024659, ack 1084883912, win 64240, options [mss 1460], length 0
然后,百度基于礼貌回应了一个(S.),这个点表示ACK (这里就明确了,会送SYN2,和ACK=SYN1+1),确认包,这里length=0
(4)17:16:47.127729 IP 192.168.141.128.58708 > 23.32.241.160.80: Flags [.], ack 1, win 29200, length 0
然后,我们基于礼貌回应了一个(.),这个点表示ACK (ACK=SYN2+1),确认包,这里length=0
然后TCP连接建立了,三次握手建立。
(5)17:16:47.127880 IP 192.168.141.128.58708 > 23.32.241.160.80: Flags [P.], seq 1:334, ack 1, win 29200, length 333: HTTP: GET /success.txt HTTP/1.1
然后我们通过HTTP协议发送一一个请求头过去,[P.]表示复制推送,不要停,不要等缓存。
(6)17:16:47.128128 IP 23.32.241.160.80 > 192.168.141.128.58708: Flags [.], ack 334, win 64240, length 0
这是可靠传输协议,所以百度给我们会送了一个ACK确认包
(7)17:16:47.214788 IP 23.32.241.160.80 > 192.168.141.128.58708: Flags [P.], seq 1:385, ack 334, win 64240, length 384: HTTP: HTTP/1.1 200 OK
然后,百度给我们返回了一个包,为384字节,立刻推送
(8)17:16:47.214832 IP 192.168.141.128.58708 > 23.32.241.160.80: Flags [.], ack 385, win 30016, length 0
基于可靠性回了一个ACK
然后是四次挥手
(9)我们发送给一个[F.]请求断开连接请求给百度服务器,length=0
(10)百度回应了ACK
(11)然后百度服务器端口发送了一个[FP.]请求断开连接
(12)我们回应了ACK同意,byebye了。
补充:tcpdump(抓包的软件)-nn(不要显示一些内容) -X -i(抓的那台网卡)eth0 port(数据包的端口号)
能够解析到未加密的具体的数据
扩展应用:
这里的端口号为80,我们可以改为我们想监听的任意端口号。;如:
nc node01 6379 //与node01的6379端口建立连接。然后就可以监听该端口
建立连接,但是不断开
请求建立
ctrl+C终止会显示