1、什么是tcpip?
简单理解就是:面向连接的、可靠的、基于字节流的传输通信协议。
是计算机通过网络通信事先都要遵守的一种约定。
2、网格分层
tcpip分为7层:物理层,数据链路层、网络层、传输层、会话层、表示层、应用层
3、三次握手(建立TCP连接)
tcp是通过三次握手来建立连接的,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立,由客户端主动触发:
客户端 -----(发送SYN和随机值seq)---------------> 服务端
服务端 -----(响应SYN、ACK=seq+1)------------>客户端
客户端 ------(发送ACK)------------------------------->服务端
通过这样三次握手后,客户端、服务端各自开辟空间为对方服务,可以开始传输数据。
我们抓包看看:
打开linux服务器,使用tcpdump命令来抓包看看,请求百度好了,开始监听:
tcpdump -nn ip host www.baidu.com
然后新开一个窗口向百度发送请求:
curl www.baidu.com
再查看刚刚监听到的内容:
上面抓包就可以看到:
第一步 192.168.0.58.40302 > 14.215.177.39.80
192.168.0.58的40302端口向14.215.177.39的80端口发起了连接请求(14.215.177.39是百度的服务器ip),seq=3932778983
第二步 14.215.177.39.80 > 192.168.0.58.40302
14.215.177.39的80端口返回数据到192.168.0.58的40302端口,返回了ack,并且将第一步的seq进行了+1返回,ack 3932778984
第三步 192.168.0.58.40302 > 14.215.177.39.80
192.168.0.58的40302端口回应了14.215.177.39的80端口,ack
三次握手完成,建立连接,开始传输数据。
常见的SYN攻击就是利用三次握手的原理来攻击的:
A(攻击者)发送TCP SYN到目标服务器,SYN是三次握手中的第一个数据包,而当服务器返回ACK以后,A不再进行回应ACK确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器收不到第三次握手,服务器重复发送ACK给A。这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。
4、四次挥手(即终止TCP连接)
建立连接数据传输完成后,tcp就开始断开连接,通过4次挥手断开的。TCP连接是全双工的(Full Duplex 是通讯传输的一个术语。通信允许数据在两个方向上同时传输),因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方的连接,收到一个FIN只是意味着这一方向上没有数据流动了,不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到另一方向也发送了FIN,双方都不再传输数据了,就可以断开了。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭:
客户端 —(发送FIN表示断开连接吧,携带seq,ack)------->服务端
服务端 —(回应ACK(将seq+1)表示我已收到)----------->客户端
服务端 —(发送FIN,我准备好了断开吧,携带seq,ack)–>客户端
客户端 —(发送ACK(将seq+1),好的,那断开吧) ------->服务端
同样我们看看刚刚抓包的数据:
5、socket
什么是socket?
socket也叫套接字、插座。是网络应用程序接口,也是应用层到传输层的接口,是用户进程与系统内核交互的接口。
6、四元组
什么是四元组?
一个tcp连接标记为一个四元组。一个计算机的端口可以从0-65535,也就是一个客户端可以向目标服务器发起65535个连接。
通过刚刚抓包可以看到这样一段:
192.168.0.58.40302 > 14.215.177.39.80
这个就是四源组:
源ip地址:源端口号 目标ip地址:目标端口号
只要四元组中的任何一个不重复就是一个连接。