TCP主要特点:
1)TCP是面向连接的的运输层协议。换句话说就是应用程序在使用TCP协议之前,必须先建立TCP连接。在传送完数据后,必须释放已经建立的连接。
2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
3)TCP提供可靠交付服务(无差错,不丢失,不重复,且按序到达)
4)TCP提供全双工通信(简单说就是通信双方都可向对方发送数据和接收数据)
5)面向字节流。TCP中的‘流’(stream)是指流入到进程或从进程流出的字节序列
TCP的连接:
TCP连接端点叫套接字(socket),RFC 793定义:端口号拼接到ip地址即构成了套接字
socket = (ip:port)
TCP三次握手
最初两端的TCP进程都属于CLOSED状态。注意:A主动打开连接 B被动打开连接。
B的TCP服务器进程先创建传输控制块TCB,准备接收客户进程的连接请求。然后服务进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,立即做出响应。
A的TCP客户端进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始的序号 seq=x。TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但是需要消耗一个序号。这时TCP客户进程进入SYN-SENT(同步以发送)状态。
B收到请求报文段后,如同意建立连接,则向A发送端确认。在确认报文段中应把SYN位和ACK位都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。要注意,这个报文段也不能携带数据,但同样需要消耗掉一个符号。这时服务器进程进入SYN-RCVD(同步收到)状态。
TCP客户进程收到B确认后,还要向B给出确认。确认报文段的ACK=1,确认号ack=y+1,而自己的序号seq=x+1.TCP标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1.这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
当B收到A的确认后,也进入ESTABLISHED(已建立连接)状态
以上就是三次握手的过程
序号seq: 占4个字节,序号范围是[0,2**32-1],共2**32个序号。序号增加到2**32-1后,下一个序号又回到0。TCP是面向字节流的。在一个TCP连接中传送的字节流中的没一个字节都按顺序编号。例如,一段报文的序号字段值是301,而携带的数据共有100字节。这就表明:本报文的数据段的第一个字节的序号是301,最后一个字节序号是400
确认号 ack: 占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。简单来说。 若确认号 = N,则表明到序号N-1为止的所有数据都已正确收到。
确认ACK : 仅当ACK=1时,确认号字段(ack)才有效。当ACK=0,时确认号(ack)无效,TCP规定,在连接建立后所有传送的报文段都必须把ACK置1
同步 SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应报文段中使SYN=1和ACK=1,因此SYN=1,表明这是一个连接请求报文或连接接受报文。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。