2 Osi参考模型与 Tcp Ip模型
应用层是由用户实现完成的,用户态;传输层、网络层、链路层是由内核完成的。
**应用层:**就是应用软件使用的协议,如邮箱使用的POP3,SMTP、远程登录使用的Telnet、获取IP地址的DHCP、域名解析的DNS、网页浏览的http协议等;这部分协议主要是规定应用软件如何去进行通信的。
**表示层:**决定数据的展现(编码)形式,如同一部电影可以采样、量化、编码为RMVB、AVI,一张图片能够是JPEG、BMP、PNG等。
**会话层:**为两端通信实体建立连接(会话),中间有认证鉴权以及检查点记录(供会话意外中断的时候可以继续,类似断点续传)。
**传输层:**将一个数据/文件斩件分成很多小段,标记顺序以被对端接收后可以按顺序重组数据,另外标记该应用程序使用的端口号及提供QOS。(不同的应用程序使用不同计算机的端口号,同样的应用程序需要使用一样的端口号才能正常通信)
**网络层:**路由选路,选择本次通信使用的协议(http、ftp等),指定路由策略及访问控制策略。(IP地址在这一层)
**数据链路层:**根据端口与MAC地址,做分组(VLAN)隔离、端口安全、访问控制。(MAC地址在这一层)处理VLAN内的数据帧转发,跨VLAN间的访问,需要上升到网络层。
**物理层:**将数据最终编码为用0、1标识的比特流,然后传输。(例如将题主头像的图片,变为一串01100111100这样的数字来表示)。
# 建立连接
#使用exec命令创建一个文件描述符(8), 本质上是一个连接(或者说是socket),该连接映射到了www.baidu.com
#连接时双向的,使用"<>"表示输入输出
[root@VM ~]# exec 8<> /dev/tcp/www.baidu.com/80
# 传送数据:发送一个Get请求到fd
[root@VM ~]# echo -e 'GET / HTTP/1.0\n' >& 8
# 传送数据:从fd中获取相应报文
[root@VM ~]# cat <& 8
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14615
Content-Type: text/html
Date: Thu, 22 Apr 2021 02:56:07 GMT
......
# 查看创建的fd(文件描述符) (在当前的bash session下查看)
[root@VM ~]# ll /proc/$$/fd
总用量 0
lrwx------ 1 root root 64 4月 22 10:54 0 -> /dev/pts/13
lrwx------ 1 root root 64 4月 22 10:54 1 -> /dev/pts/13
lrwx------ 1 root root 64 4月 22 10:54 2 -> /dev/pts/13
lrwx------ 1 root root 64 4月 22 10:58 255 -> /dev/pts/13
lrwx------ 1 root root 64 4月 22 10:58 8 -> socket:[2325470]
第2种方式:
[root@VM ~]# nc www.baidu.com 80 #创建连接
GET / HTTP/1.0 #发送请求数据,回车
#回车
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14615
Content-Type: text/html
Date: Thu, 22 Apr 2021 05:38:02 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=BA2F5361920EB8DD262B837E8C15FB85:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=BA2F5361920EB8DD262B837E8C15FB85; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1619069882; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=BA2F5361920EB8DD023EDEC433879501:FG=1; max-age=31536000; expires=Fri, 22-Apr-22 05:38:02 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 161906988204112489068423896341082999597
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
<!DOCTYPE html><!--STATUS OK-->
....
TCP:面向连接的可靠的传输协议(传输控制协议)
- 连接:通过3次握手,建立连接。3次握手后,双方会开辟资源(如接收队列、发送队列等),这个资源就是连接(socket)。socket可以理解为”IP1:PORT1:IP2:PORT2“的四元组(四个元素构成的组合)。注意:每台服务器最多监听65535个端口,是指四元组的其他3个元素固定时,端口的取值是65535个。即客户端可以视同同一个IP和端口与2个服务端建立连接,客户端也可以使用同一个端口的不同IP与一个远程服务端建立连接。
- 可靠:每个请求必须有与之对应的应答,没有应答会导致重新发送请求。
- 控制:体现在TCP协议字段中有6个标志位,TCP包是一些控制包。
- 连接断开的目的:释放资源(socket),经过4次挥手后方可断开连接。
终端1:
[root@VM ~]# tcpdump -nn -i em1 host www.baidu.com
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 262144 bytes
# 3次握手
#第一个包:客户端发送给百度。[S]表示发送SYN=1;”length 0“表示包的body长度为0,说明是一个控制包。此外可以看到:seq=1497925401
16:38:18.439110 IP 64.115.5.17.49820 > 110.242.68.4.80: Flags [S], seq 1497925401, win 29200, options [mss 1460,sackOK,TS val 2879803051 ecr 0,nop,wscale 7], length 0
#第2个包:百度应答客户端。[S.]表示发送SYN=1和ACK=1(点表示ACK标志位为1);”length 0“表示包的body长度为0。此外可以看到:seq=2309374220、ack=1497925402(值为上一个包的seq+1)
16:38:18.459926 IP 110.242.68.4.80 > 64.115.5.17.49820: Flags [S.], seq 2309374220, ack 1497925402, win 29040, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
#第3个包:客户端应答百度。[.]表示发送ACK=1;”length 0“表示包的body长度为0
16:38:18.459975 IP 64.115.5.17.49820 > 110.242.68.4.80: Flags [.], ack 1, win 229, length 0
#至此,连接创建。我们在终端2中执行Ctrl+C断开连接
#断开连接
#第1个包:[F.]表示发送FIN=1,ACK=1
16:38:30.020576 IP 64.115.5.17.49820 > 110.242.68.4.80: Flags [F.], seq 1, ack 1, win 229, length 0
#第2个包:[.]表示发送ACK=1
16:38:30.041177 IP 110.242.68.4.80 > 64.115.5.17.49820: Flags [.], ack 2, win 227, length 0
#第3个包:[F.]表示发送FIN,ACK=1
16:38:30.041408 IP 110.242.68.4.80 > 64.115.5.17.49820: Flags [F.], seq 1, ack 2, win 227, length 0
#第4个包:[.]表示发送ACK=1
16:38:30.041437 IP 64.115.5.17.49820 > 110.242.68.4.80: Flags [.], ack 2, win 229, length 0
终端2:
[root@VM ~]# nc www.baidu.com 80 #3次握手建立连接
^C #此处不进行数据请求,ctrl+C断开连接
终端1:
[root@VM ~]# tcpdump -nn -i em1 host www.baidu.com
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 262144 bytes
#3次握手,不再做分析
09:38:35.001560 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [S], seq 655484775, win 29200, options [mss 1460,sackOK,TS val 2941019614 ecr 0,nop,wscale 7], length 0
09:38:35.025300 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [S.], seq 1249785822, ack 655484776, win 29040, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
09:38:35.025378 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [.], ack 1, win 229, length 0
#发送HTTP请求
#客户端发送HTTP(分成2个segment发送)
# 第1个segment:[P]表示PUSH标志位;
09:38:37.101421 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [P.], seq 1:16, ack 1, win 229, length 15: HTTP: GET / HTTP/1.0
# 百度回复确认
09:38:37.125086 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [.], ack 16, win 227, length 0
# 第2个segment:
09:38:37.802129 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [P.], seq 16:17, ack 1, win 229, length 1: HTTP
#ack 17:客户端发送的2个segment,最终的ack为17。后续服务端给返回数据的时候,ack也是17,表示ac7=17的包都是对该请求的应答数据包。
09:38:37.826273 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [.], ack 17, win 227, length 0
# 百度发送数据的第一个包:length 1400;seq=1:1401表示数据的segment偏移量
09:38:37.827315 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [.], seq 1:1401, ack 17, win 227, length 1400: HTTP: HTTP/1.0 200 OK
09:38:37.827346 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [.], ack 1401, win 251, length 0
09:38:37.827566 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [P.], seq 1401:4073, ack 17, win 227, length 2672: HTTP
09:38:37.827585 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [.], ack 4073, win 293, length 0
09:38:37.827805 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [.], seq 4073:6873, ack 17, win 227, length 2800: HTTP
09:38:37.827829 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [.], ack 6873, win 337, length 0
09:38:37.828052 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [.], seq 6873:9673, ack 17, win 227, length 2800: HTTP
09:38:37.828070 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [.], ack 9673, win 381, length 0
#最后一个数据包:从第1个数据包和最后一个数据包会组合成一个完整的数据
09:38:37.828291 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [.], seq 9673:12473, ack 17, win 227, length 2800: HTTP
09:38:37.828306 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [.], ack 12473, win 424, length 0
# 4次分手
09:38:37.828531 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [FP.], seq 12473:15552, ack 17, win 227, length 3079: HTTP
09:38:37.828549 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [.], ack 15553, win 473, length 0
09:38:39.876098 IP 64.115.5.17.34710 > 110.242.68.3.80: Flags [F.], seq 17, ack 15553, win 473, length 0
09:38:39.899883 IP 110.242.68.3.80 > 64.115.5.17.34710: Flags [R], seq 1249801375, win 0, length 0
终端2:
[root@VM ~]# nc www.baidu.com 80
GET / HTTP/1.0 #此处2次回车
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14615
Content-Type: text/html
终端1:
[root@VM ~]# tcpdump -nn -i em1 host www.baidu.com
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 262144 bytes
# 3次握手
10:05:42.765586 IP 64.115.5.17.49834 > 110.242.68.4.80: Flags [S], seq 2127344947, win 29200, options [mss 1460,sackOK,TS val 2942647378 ecr 0,nop,wscale 7], length 0
10:05:42.792718 IP 110.242.68.4.80 > 64.115.5.17.49834: Flags [S.], seq 1972366550, ack 2127344948, win 29040, options [mss 1400,nop,nop,sackOK,nop,wscale 7], length 0
10:05:42.792775 IP 64.115.5.17.49834 > 110.242.68.4.80: Flags [.], ack 1, win 229, length 0
#http请求
# 发送http请求
10:05:42.792905 IP 64.115.5.17.49834 > 110.242.68.4.80: Flags [P.], seq 1:78, ack 1, win 229, length 77: HTTP: GET / HTTP/1.1
10:05:42.817815 IP 110.242.68.4.80 > 64.115.5.17.49834: Flags [.], ack 78, win 227, length 0
# 百度返回数据
# 第1个segment
10:05:42.819783 IP 110.242.68.4.80 > 64.115.5.17.49834: Flags [P.], seq 1:1441, ack 78, win 227, length 1440: HTTP: HTTP/1.1 200 OK
10:05:42.819836 IP 64.115.5.17.49834 > 110.242.68.4.80: Flags [.], ack 1441, win 251, length 0
# 第2个segment
10:05:42.819903 IP 110.242.68.4.80 > 64.115.5.17.49834: Flags [P.], seq 1441:2782, ack 78, win 227, length 1341: HTTP
10:05:42.819925 IP 64.115.5.17.49834 > 110.242.68.4.80: Flags [.], ack 2782, win 274, length 0
#4次挥手
10:05:42.820042 IP 64.115.5.17.49834 > 110.242.68.4.80: Flags [F.], seq 78, ack 2782, win 274, length 0
10:05:42.842311 IP 110.242.68.4.80 > 64.115.5.17.49834: Flags [.], ack 79, win 227, length 0
10:05:42.842350 IP 110.242.68.4.80 > 64.115.5.17.49834: Flags [F.], seq 2782, ack 79, win 227, length 0
10:05:42.842371 IP 64.115.5.17.49834 > 110.242.68.4.80: Flags [.], ack 2783, win 274, length 0
终端2:
[root@VM ~]# curl www.baidu.com
...