TCP面向连接编程

一、TCP协议基础

      TCP是一种面向连接的(连接导向的)、可靠地、基于字节流的传输层通信协议。

1、TCP支持的服务类型

(1) FTP文件传送(File Transfer)

      文件传送协议FTP允许用户从一台计算机到另一台计算机到另一台取得文件,或发送文件到另一台计算机。从安全性方面考虑,需要用户指定一个使用其他计算机的用户名和口令,一旦你要访问另一台系统中的文件,任何时刻都要运行FTP,而且只能拷贝到自己机器中才可以使用它。

(2) RLogin 远程登录(Remote Login)

      网络终端协议Telnet允许用户登录到网络的中的任一计算机上。你可以启动一个远程进程连接到指定计算机。直到进程结束,期间你所键入的内容会被送到指定的计算机。值得注意的是,这时你实际上是与你的计算机进行对话。Telnet程序使得你的计算机在整个过程中不见了,所敲的每一个字符直接送到所登录的计算机系统。退出远程系统后,Telnet程序也就退出,你又与自己的计算机对话了

(3) SMTP POP3 电子邮件(Mail)

      SMTP POP3允许你发送消息给其他计算机的用户。计算机邮件系统只需要你简单地往另一用户的邮件文件中添加信息、服务器Server是为网络上其他计算机提供指定服务的系统,客户机Client是得到这种服务的另外的计算机系统。

(4) NFS网络文件系统(Network File System)

      接近于FTP。网络文件系统提供磁盘或设备服务,而无需特定的网络实用程序来访问另一系统的文件。可以简单地认为它是一个外加的磁盘驱动器。这种额外的“虚拟”磁盘驱动器就是其他计算机系统的磁盘。

(5)远程打印(Remote Printing)

(6) 远程执行(Remote Executing)

(7) 名字服务器(Name Servers)

(8)终端服务器(Ternimal Servers)

2、TCP段格式

  TCP的段格式结构:

源端口:16bit源端口指的是发起通信的端口号。

目的端口:16bit目的端口指的是传输目的地的端口号。

序号:该序号是32bit的无符号数,到达2^32-1后又从0开始,表示在这个报文段中的第一个数据字节的编号。利用序号段可以纠正传输导致的乱序,从而重组分段报文。

确认序号(SIN):TCP使用32bit确认号标识下一个希望收到的报文的第一个字节的编号。因此,确认号应该是上一次成功接收到的数据字节号加1

首部长度:4bit,该字段以字为单位计量TCP头长度

保留:6bit恒为0

URG:紧急指针有效

ACK:确认序号有效

PSH:接收方应该尽快将这个报文交给应用层

RST:重置连接

SYN:同步序号,用来发起一个连接

FIN:发送端完成发送任务

窗口:该16bit字段表明接收端声明可以接收的TCP数据段大小,最大为65535字节

校验和:该16bit由发送端计算存储,由接收端进行验证。验证整个TCP,包括首部和数据

紧急指针:只有当URG置1时才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。通常用于发送紧急数据

选项:常见可选字段是最长报文大小

数据: TCP数据部分可选。建立和释放连接时,双方交换的只有TCP首部。

3、TCP通信

3.1  三次握手

在使用TCP进行通信时,首先需要建立连接。建立连接需要经过如下3次握手。

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

 

3.2 四次挥手

所谓四次挥手是指终止TCP连接时,需要客户端和服务器端总共发送4个包已确认连接的断开。整个流程如下:

这里假设客户端率先想要关闭连接

(1)对于客户端来说:

         客户端想要终止TCP连接,于是发送一个带FIN标志的报文,之后客户端就开始等待服务器端的答复,自身转换为FIN_WAIT_1状态。在FIN_WAIT_1状态下收到对方回应的ACK报文即进入FIN_WAIT_2状态,而收到对方发来的FIN报文并回应ACK报文状态变更为TIME_WAIT状态,而假如FIN_WAIT_1状态下直接收到了对方同时带有FIN和ACK标志的报文时,就可以直接进入TIME_WAIT状态,而无需经过FIN_WAIT_1状态。

(2)对于服务器端来说:

           对方close一个SOCKET后发送FIN报文给自己,服务器端会回应一个ACK交给对方,此时则进入CLOSE_WAIT状态,接下来,如果自己已经没有数据发送给对方,则会发送FIN报文给,此时状态变更为LACK_ACK,此状态是被动方在等待最后的对方的ACK报文,当收到ACK报文后就进入CLOSED状态。(正常情况下,主动方发送FIN报文后会先收到对方发来的ACK报文,但是特殊情况是发送FIN后并未接收到对方的ACK报文但却先接收到了对方的FIN报文,此时,进入CLOSING状态表示双方都在关闭SOCKET连接)

正常情况下的四次挥手

 

  出现CLOSING状态情况

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值