前言:适逢期中考。。。。
本文参考自很多文章、课本、PPT等(其实仔细观察你会发现很多文字甚至图片都是一致的),如有雷同,纯属不巧合(抱拳)
TCP 套接字是由一个四元组(源 IP 地址,源端口号,目的 IP 地址,目的端口号)来标识的。
首部只有 4 个字段,每个字段 2 字节 16 位。其中,长度指示了 UDP 报文段中的首部加数据的字节数。
检验和 是 UDP 的差错检测机制。其实现方法是:
1. 将 UDP 报文按 16 比特进行分组。
2. 先取前面两个16比特数字进行加运算,有溢出记得回卷,即溢出位加到最低位再进行加运算
3. 2中得到的数再跟下一个16比特数字进行加运算,直到报文末端
4. 将最终得到的 16 比特的数按位取反即为检验和。
PS:TCP协议中,主动发起请求的一端称为『客户端』,被动连接的一端称为『服务端』。不管是客户端还是服务端,TCP连接建立完后都能发送和接收数据。
起初,服务器和客户端都为CLOSED状态。在通信开始前,双方都得创建各自的传输控制块(TCB)。
服务器创建完TCB后遍进入LISTEN状态,此时准备接收客户端发来的连接请求。
客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。
服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。
该应答发送完成后便进入SYN-RCVD状态。
当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
该报文段的头部为:ACK=1,seq=x+1,ack=y+1。
客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!
防止失效的连接请求报文段被服务端接收,从而产生错误。
PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。
若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
发送方通过套接字向TCP的发送缓存中传输数据,当数据达到最大报文段长(MSS)时TCP就将缓存加上一个TCP首部形成报文段发送给接收方的TCP接收缓存。
TCP连接的释放一共需要四步,因此称为『四次挥手』。
我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。
若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:
FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。
B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:
ACK=1,seq=v,ack=u+1。
第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。
A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
为了保证B能收到A的确认应答。
若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
客户机端TCP发送一个特殊报文段,不包含应用层数据,但首部的SYN置1,并选择一个起始序号client_isn放置到该报文序号字段中。服务器接收后为该TCP建立分配TCP缓存和变量,并发送允许报文段,SYN置1,确认号为client_isn+1,序号段中则是自己的初始序号server_isn,客户端收到这个报文后也会分配缓存和变量。并发送第三个报文,SYN置0,确认字段为server_isn+1,目的是确认信息。这个过程被称作三次握手。连接终止时客户端发出FIN置1的报文,服务器也发挥FIN置1报文,客户端确认后双方释放资源。
PS:网络层传输的数据单元为『数据报』,传输层的数据单元为『报文段』,为了方便起见可以统称为『分组』。