(一)传输控制协议TCP:
- 面向连接的,可靠的,基于字节流的传输层通信协议
- 将应用层的数据流分割为报文段并发送给目标节点的TCP层
- 数据包都有序号,对方收到则发送ACK确认,未收到则重传
- 使用校验和来检验数据传输过程是否有误
IP协议:是TCP/IP体系中的网络层协议,根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务
(二)TCP报文头:
下图为TCP报文头的图解:
- **source port ,Destination port:**分别表示源端口目的端口,它们各占用两个字节,TCP和UDP均不包含IP,因为IP属于网络层,但它们均包含端口,因为其属于传输层。
线程通信可以通过:管道,内存共享,消息队列,信号量
前提是两个进程可以以标识唯一进程,通过此进程找到对应进程,在本地进程中可使用PID唯一标识进程
如果在不同主机,则要在协议使用不同的端口号
IP可以唯一标识主机,TCP和端口号可以唯一标识唯一线程,因此,TCP/IP便可以标识主机中的唯一进程,也成为套接字,即Sockt
- **sequence number:**占用四个字节,TCP中传输的每个字节均按字节编号
- **ACK number:**期望收到对方下一个报文的第一个字节序号
- **offset:**数据偏移,指出TCP报文的数据距离TCP报文起始处有多远
- **Reserved:**保留域
- TCP Flags:
- 1.URG:紧急指针标志,为1时标识紧急标志有效
- 2.ACK:确认序号标志,为1时标识确认号有效,为0时标识不含确认信息,忽略确认号字段
- 3.PSH:为1表示有push号,接收方接受到报文段后,尽快将报文段交给应用程序,而不再缓冲区排队
- 4.RST:重置连接标志
- 5.SYN:同步序号:用于建立来连接过程,SYN=0,ACK=0表示该数据段为使用捎带的确认域
- 6.FIN:finish标志,用于释放来连接,为1时表已关闭本方数据流
**windows:**告知发送端,接收端的缓存大小,控制发送端发送的速率,达到流量控制
checksum检验和,对于整个TCP报文段,TCP头部,TCP数据以16位进行计算所得,由发送端计算存储,由接受端进行验证
urgent pointer紧急指针
(三)TCP握手
当一个应用程序希望与另一个程序建立通信,它会发送一个通信请求,这个请求要被发送到一个确切的地址,在 双方握手之后,TCP将在两个应用之间建立全双工的通信,这个全双工通信将占用两个应用的通信,直到一方或双方关闭
握手是未来建立连接:
- 服务器先创建一个传输块PCB,进入Listener监听状态,之后客户端也会创建以一个传输块PCB,进入监听状态,之后客户端向服务器发出请求报文SYN,seq,SYN为同步序号,初始序号seq,发送后客户端进入SYN_SENT的状态,发送后的数据包为SYN报文段,消耗一个序号,为第一次握手。
- 然后服务器端发出确认报文SYN=1,ACK=1,seq=y,ack=x+1,服务器进入SYN_RCVD状态。
- 第三次客户端接受到后变为ESTAB_LISHED状态发送ACK=1,seq=x+1.ack=y+1;服务器也进入ESTABLISHED状态
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
1.第一次握手:建立连接时,客户端发送SYN包(syn=j)服务器,进入SYN_SEND状态,等待服务器确认
2第二次握手:服务器接收到SYN包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态
3第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器端进入ESTABLISHED状态,完成第三次握手
(四)三次握手的原因:
为了初始化Sequence number的初始值
首次握手的隐患:SYN超时
原因:
- 服务器收到客户端的SYN,恢复SYN-ACK时ACK未确认
- 服务器端不断重试直至超时,Linux默认等待63秒后断开
针对SYN Flood的防护措施:
- SYN 队列满后,通过tcp_syncookiese参数返回SYN Cookies
- 若为正常连接则客户端会发SYN Cookies,直到建立连接
若建立连接,客户端出现故障:
保活机制:向对方发送保活探测报文,若为收到响应则继续发送,当尝试次数达到保活探测数仍无相应则中断连接