TCP是传输控制协议,将数据可靠的在双方之间传递。
┌────────────────────────────────────────────────────────────────┐ │ Source Port │ Destination Port │ (16 bits each) ├────────────────────────────────────────────────────────────────┤ │ Sequence Number │ (32 bits) ├────────────────────────────────────────────────────────────────┤ │ Acknowledgment Number │ (32 bits) ├───┬───────┬───────┬────────────────────────────────────────────┤ │HLEN│ Reserved │ Flags │ Window Size │ (4, 6, 6, 16 bits) ├────────────────────────────────────────────────────────────────┤ │ Checksum │ Urgent Pointer │ (16 bits each) ├────────────────────────────────────────────────────────────────┤ │ Options and Padding (if any) │ (variable) ├────────────────────────────────────────────────────────────────┤ │ Data (if any) │ (variable) └───────────────────────────────────────────────────────────
TCP的套接字使用IP地址和端口号来唯一标识网络中的通信端点。为通信提供了一个接口。
- 发送缓冲区:
- 当应用程序调用发送函数(如send())时,数据并不是直接发送到网络上,而是先被复制到发送缓冲区中。
- 操作系统会负责从发送缓冲区中取出数据,并通过网络发送给接收方。
- 发送缓冲区的大小可以通过setsockopt()函数进行设置,但通常不建议主动设置,因为操作系统会根据网络环境和系统资源自动调整。
- 接收缓冲区:
- 当数据从网络到达时,它们首先被存放在接收缓冲区中。
- 应用程序通过调用接收函数(如recv())来从接收缓冲区中读取数据。
- 接收缓冲区的大小同样可以通过setsockopt()函数进行设置,但也需要谨慎处理。
为什么要三次握手?
三次握手是为了使双方都确定对方的接收能力。倘若是二次握手,首先对于客户端来说,收到了服务端的ack报文,确定了服务端可以收到自己的报文。而对于服务端来说并没有收到服务端的确认报文,不确定服务端是否能收到自己的报文所以两次肯定不够。
为什么四次挥手?
在第二次挥手和第三次挥手的时间间隔内服务器可能还需要处理一些客户端传来的数据。所以在第二次挥手中告诉客户端我知道了,我处理完之后就结束连接,等处理完之后发送第三次挥手。
泛洪攻击:客户端向服务端发送syn报文而不再给服务器进行回复,这样使得服务端的半连接队列达到最大值,从而导致无法再工作。解决此问题可以使用syncookies验证客户端的身份。