概述
首先来了解几个名词——
- WWW(World Wide Web):万维网,是一个大规模的、联合式的信息储藏所,英文简称Web。
- HTTP(HyperText Transfer Protocol):超文本传输语言,它定义了客户端如何向王维网服务器请求万维网文档(即数据资源),它是万维网上可靠的交换文件的基础,每个万维网都有一个服务器进程,它不断地监听TCP的端口80,以便发现有客户端向它发出连接建立请求,一旦监听到连接建立请求并建立了TCP连接后客户端就向万维网服务器发出获取某个资源数据,服务器接着就反回所有请求的数据作为响应,最后TCP连接就被释放了。
HTTP的连接,使用的是TCP连接。
内容
1、TCP连接
TCP,即传输控制协议,它是TCP/IP体系中的协议之一。
- TCP是面向连接的运输层协议,应用在使用TCP协议之前,必须先建立TCP连接,在数据传送完毕后,必须释放已经建立的TCP连接。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点。
- TCP提供可靠交付的服务,通过TCP连接传送数据,无差错、不丢失、不重复并且按序到达。
- TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送和接收数据,并且TCP连接的两端都设有发送缓存和接收缓存。
- 面向字节流。TCP中的“流”指的是流入进程或从进程流出的字节序列。
TCP为HTTP提供了一条可靠的比特传输管道,从TCP连接一端的字节会从另一端以原有的顺序,正确的传送出来。
TCP流是分段的,由IP分组传送,即是通过名为IP分组(或IP数据报)的小数据块来发送的
1.1、TCP的连接
TCP把连接作为最基本的抽象。每一个TCP有两个端点,这个连接的端点叫做套接字或插口,端口号拼接到 IP地址即构成了套接字。
套接字socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP连接 ::={socket1:socket2} = {(IP1:port1),(IP2:port2)}
- TCP的连接建立:
序号(seq):TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号字段的意思是本报文段所发送的数据的第一个字节的编号。
确认号(ack):期望收到对方下一个报文段的第一个数据字节的编号,也就是说确认号与发送方下一次发送过来的报文段的序号(seq)相等。
若确认号是N,则表示我方已正确收到了N-1为止的所有数据。
确认(ACK):仅当ACK为1的时候确认号(ack)才有效,由于连接建立后就要发送数据,所以连接建立后传输的所有报文段ACK都要为1。
同步号(SYN):SYN=1,ACK=0表示这是一个请求连接的报文段,SYN=1,ACK=1表示这是一个同意连接的报文段。
终止(FIN):FIN=1时,表示此报文段的发送方的数据已发送完成,要求释放连接。
A是主动打开连接,B是被动打开连接。
B服务器创建传输控制模块TCB后,一直处于LISHEN状态,等待客户端请求;A的客户端进程也是先创建传输控制模块,然后向b发出请求报文段,这时首部中的同步位syn=1,同时选择一个初始化序列号seq=x。SYN报文段不能携带数据,但要消耗一个序号。
B收到连接请求报文后,如果同意建立连接,则向A发送确认。在确认报文中把SYN位和ACK位都置1,去人号是ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样需要消耗一个序号。这时TCP服务器进程进入SYN-RCVD的状态。
TCP客户端进程收到B的确认后,还需要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。ACK的报文段可以携带数据,但如果不携带数据就不消耗序列号,因此下一数据报文段的序号seq=x+1.这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
当B收到A的确认后,也进入ESTABLISHED状态。
为什么是三次握手而不是两次?
举个不恰当的例子,男生向女生发出交往请求的信件,信件因为某些原因滞留延误,男生苦苦等待回信却未果,伤心欲绝遂放弃,但女生后来还是收到了这封信,于是向男生发出同意确认交往的信件。如果这里不采用三次握手,那么只要女生发出确认,就默认她和他已经可以交往了,但是男生已经放弃回应,女生就会一直苦等男生发出爱的信件,等到花都谢了。如果有第三次握手,这里女生就会在男生发出确认请求后才同意交往,就不会苦苦等待爱情。
- TCP的连接释放:
A和B开始时都处于ESTABLISHED状态,A的应用进程先向其应用进程发送连接释放报文段,并停止发送数据,主动关闭TCP连接。
A把连接释放报文段首部的终止控制位置1,其序号seq=u,它等于前面已经传送过的数据的最后一个字节的序号加1,这时A进入FIN-WAIT-1(终止等待1)的状态,等待B确认。
B收到连接释放报文段后立即发出确认,确认号时ack=u+1,这个报文段自己的序号时v,等于B前面已传送过的数据的最后一个字节的序列号加 1,然后B就进入CLOSE-WAIT(等待关闭)状态。
B通知高层应用进程,因而从A到B这个方向的连接就释放了,此时TCP处于半关闭状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。
A收到来自B的确认后进入FIN-WAIT-2(终止等待1)状态,等待B发出释放报文。
若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接,这时B发出的释放连接报文段FIN=1,现在B的序号w(在半关闭状态B可能又发送了一些数据),B还必须重复上次发送过的确认号ack=u+1,这时B进入LAST-ACK(最后确认)状态,等待A的确认。
A在收到B的连接释放报文段后,必须发出确认,确认报文中ACK置1,确认号ack=w+1,而自己的序号是seq=u+1。然后进入到TIME-WAIT状态。这时TCP连接还没释放,必须经过时间等待计时器(TIME-WAIT timer) 设置的时间2MSL后,A才进入到CLOSED状态。MSL叫做最长报文段寿命。