一.TCP
TCP是面向连接的丶可靠的字节流协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯.
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。
TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序(即应用层)。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
TCP的滑动窗口
发送方和接收方都会维护一个数据帧的序列,这个序列被称作窗口。发送方的窗口大小由接收方确认,目的是控制发送速度,以免接收方的缓存不够大导致溢出,同时控制流量也可以避免网络拥塞。
滑动窗口通俗来讲就是一种流量控制技术。
滑动窗口实例:
- 首先是第一次发送数据这个时候的窗口大小是根据链路带宽的大小来决定的。我们假设这个时候窗口的大小是 3。这个时候接受方收到数据以后会对数据进行确认告诉发送方我下次希望手到的是数据是多少。
- 这里我们看到接收方发送的 ACK=3(这是发送方对发送序列2的回答确认,下一次接收方期望接收到的是 3序列信号)。
- 这个时候发送方收到这个数据以后就知道我第一次发送的 3 个数据对方只收到了 2 个。就知道第 3 个数据对方没有收到。下次在发送的时候就从第3 个数据开始发。此时窗口大小变成了 2 。
- 于是发送方发送 2 个数据。看到接收方发送的 ACK 是 5 就表示他下一次希望收到的数据是 5,发送方就知道我刚才发送的 2 个数据对方收了这个时候开始发送第 5 个数据。
这就是滑动窗口的工作机制,当链路变好了或者变差了这个窗口还会发生变话,并不是第一次协商好了以后就永远不变了。
所以滑动窗口协议,是 TCP 使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
TCP三次握手
SYN 洪泛攻击
但是在 TCP 三次握手中是有一个缺陷的,就是如果我们利用三次握手的缺陷进行攻击。这个攻击就是 SYN 洪泛攻击。三次握手中有一个第二次握手,服务端向客户端应道请求,应答请求是需要客户端 IP 的,服务端是需要知道客户端 IP的,攻击者就伪造这个 IP,往服务器端狂发送第一次握手的内容,第一次握手中客户端 IP是伪造的,从而服务端忙于进行第二次握手但是第二次握手当然没有结果,所以导致服务器端被拖累,死机
TCP四次挥手
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为 seq=u,客户端进入 FIN-WAIT-1(终止等待 1)状态。
- 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号 seq=v,此时,服务端就进入了 CLOSE-WAIT(关闭等待)状态。但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT 状态持续的时间。(客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待 2)状态)
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,客户端就进入了 TIME-WAIT(时间等待)状态。注意此时 TCP 连接还没有释放,必须经过 2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的 TCB 后,才进入 CLOSED状态。
二.UDP
UDP是面向无连接丶不可靠的的数据报协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。
端口号
数据链路和 IP 中的地址,分别指的是 MAC 地址(MAC地址是网卡地址)和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。
HTTP请求的传输过程
一次完整http请求的7个过程
1.建立 TCP 连接(之前可能还有一次DNS域名解析)
2.客户端向服务器发送请求命令
3.客户端发送请求头信息
4.服务端向客户端返回响应;
例如: HTTP/1.1 200 OK
响应的第一部分是协议的版本号和响应状态码
5.返回响应头信息
6.服务器向客户端发送数据
7.服务器关闭 TCP 连接
Http请求协议报文结构
请求报文结构:
返回报文结构:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。