您的位置:首页 > 理论基础 > 计算机网络

深入理解计算机网络学习笔记--TCP

2015-02-13 10:52 369 查看
参考链接 https://www.centos.bz/2012/08/tcp-establish-close/
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。

TCP的三次握手:服务器初始化:从closed状态创建socket,bind,listen。客户端从closed开始创建socket,调用connect原语时,向服务器发送一个将SYN(同步数据段)字段置1的数据段(假设初始序号seq=i),主动打开端口,进入SYN SENT状态。这是第一次握手。

服务器收到客户端的SYN数据段后,返回一个SYN=1的数据段,ACK(确认控制位)字段置1(表示有效),ack=i+1(确认号=i+1,告诉客户端下次发送数据段的第一个字节序号是i+1),假设自己的初始序号seq=j,被动打开端口,进入SYN RCVD状态(已收到请求但还未确认)。第二次握手完成。

客户端收到服务器的SYN+ACK后,发送一个SYN=1,ACK=1,seq=i+1,ack=j+1的确认数据。同时进入ESTABLISHED状态,服务器收到ACK后也进入ESTABLISHED状态。第三次握手完成。

TCP数据段格式:

序号:数据部分第一个字节的编号,例如,一个数据段的序号的字段值是101,该字段共有100字节,则表明改数据段最后一个字节的编号是200,下一个数据段的编号应该从201开始。

确认号:指期望接收到的一方下一个数据中数据部分的第一个字节的序号,例如主机B收到A发来的数据段其序号是101,长度100字节,那么主机B给主机A发送的确认号为201,即ACK为201,表示希望A下次发送的数据从201开始。

正是由于序号和确认号的机制使得TCP的可靠性有了保障。

TCP 四次挥手

TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

1.客户端认为数据发送完了 想结束本次链接,则像服务器发送一个FIN置1的数据段,假设seq=m,客户端进入FIN WAIT 1状态,等待服务器确认。第一次挥手。

2.服务器收到请求后,确认客户端没有数据要发送了,则像客户端发送一个ACK 置1,ack=m+1,seq=n的数据段,表示前面的数据已经全部收到,进入CLOSE WAIT状态。与此同时,服务器通知应用层进程,释放从客户端到服务器的链接,进入半关闭状态。此时服务器仍可以向客户端发送数据,客户端也可以继续接收。知道服务器数据发送完为止。第二次挥手。此时,客户端收到服务器的ACK后进入FIN
WAIT 2状态,进一步等待服务器发出连接释放的数据段。

3.服务端数据传送完成后,其对应的应用进程会通知TCP实体释放此方向的TCP传输连接,向客户端发送FIN置1,ACK置1,seq=w(假设此时的数据段序号已经变城w),ack=m+1的确认数据段,这是服务器进入LAST ACK状态,等待客户端的确认。第三次挥手。

4.客户端收到服务端的FIN+ACK数据段后,发送ACK=1,seq=m+1,ack=w+1数据段,进入TIME WAIT状态,此时TCP连接还没有释放,必须等到2MSL时间后客户端才进入CLOSED状态彻底释放连接。服务器收到ACK后也进入CLOSED状态,完成整个连接释放过程。第四次挥手。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: