一、TCP协议:

 

如图,TCP (Transmission Control Protocol) 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议。

TCP协议完成第四层传输层所指定的功能,TCP层位于IP层之上,应用层之下的中间层。

不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,只是提供IP报文的不可靠的包交换

 

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体 的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延()内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

 

1. TCP 首部

 

 

---Source Port是源端口,16位。

---Destination Port是目的端口,16位。

---Sequence Number是发送数据包中的第一个字节的序列号,32位。

---Acknowledgment Number是确认序列号,32位。

---Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。[1] 

---标志位: 6位,URG表示Urgent Pointer字段有意义:

ACK表示Acknowledgment Number字段有意义

PSH表示Push功能,RST表示复位TCP连接

SYN表示SYN报文(在建立TCP连接的时候使用)

FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)

Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。

---Checksum是校验和,16位。

---Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。

 

 

 

2. TCP 连接建立:

TCP是互联网中的传输层协议,使用三次握手建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。

这种建立方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议(slice window)

 

 

3. TCP 三次握手过程:

1. 客户端发送SYN 报文给服务器端,进入SYN_SEND状态

2. 服务器端收到SYN报文,回应一个SYN-ACK报文,进入SYN_RECV状态

3. 客户端收到服务器端的SYN报文,回应一个ACK报文,进入ESTABLISHED状态

 

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过  “四次握手”

4. 四次断开:

建立一个TCP连接需要三次握手,而终止一个TCP连接要经过四次断开,这是由于TCP的半关闭(half-close)造成的。过程如下:

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

 

0_1312719804oSkK.gif                               0_1312719833030b.gif

在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。

典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

 

二、 Socket通信

Socket(套接字): 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字, 是支持的的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

 

用户进程通过注册套接字来完成不同主机间的通信(IPC),socket可以看成两个进程进行通讯连接的一个端点,是连接进程和网络驱动程序的桥梁。

socket在进程中创建,通过绑定与网络驱动建立关系。伺候,应用程序送给socket的数据,由socket交给网络驱动程序向网络中发送出去。

计算机从网络上收到与该socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给socket,进程便可从socket中提取接受到的数据。

 

 

众所周知:

      端口号  0~1023:管理员才有权限使用,永久地分配给某应用使用;
    注册端口:
        1024~41951:只有一部分被注册,分配原则上非特别严格;
    动态端口或私有端口:
        41952+:

        /proc/sys/net/ipv4/ip_local_port_range: 定义两个数字,表示可以做为临时端口的起始数字和结束数字

        传输层协议:TCP、UDP、SCTP、DCCP

    套接字类型:

        tcp socket
        udp socket
        raw socket: 跨过TCP/IP层无法处理的IP包,用socket直接来接受发向本及的ICMP/IGMP协议包,也可以用来发送一些自定义包头或自订协议的IP包。

 

 

    TCP协议的功能:

        连接建立
        将数据打包成段
            校验和
        确认、重传以及超时
        排序
            序列
        流量控制
            缓冲区
            滑动窗口
        拥塞控制
            慢启动
            拥塞避免算法

        RFC:有时间一定好好读读TCP的RFC,会对TCP协议有一个更深层的认识

    socket: IPC的一种实现,用于同一或不同主机上的进程间的通信;

    socket通信在domain中实现:

        识别一个socket的方法(socket地址格式),有以下三种类型:

    domain:

        Unix Domain: 基于socket机制实现同一主机不同进程间通信的一种方式;AF_UNIX, AF_LOCAL,地址是一个路径名(文件)
        IPv4 Domain: AF_INET, 基于socket机制借助于ipv4协议实现不同主机(也可以是同一主机)上的进程间通信的机制; 地址是32位的ipv4地址+16位的端口号
        IPv6 Domain: AF_INET6, 地址是128位的Ipv6地址+16位的端口号

    socket的类型:

        TCP:流式socket,SOCK_STREAM
            可靠、双向、面向字节流
        UDP:数据报式socket, SOCK_DGRAM

    相关的系统调用:
        socket(): 创建一个新的socket
        bind():绑定于一个套按字地址上;
        listen(): 监听套接字;
        accept(): 接收连接请求;

        connect(): 发起连接请求;

        close(): 关闭连接

        read()和write(): recv(), send(), recvfrom(), sendto()

 

    

    tcp协议通过tcp状态来标记当前处于通信过程的哪个阶段:
        CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIME_WAIT, CLOSED

       常用软件: 可以查看当前tcp/udp协议的状态:  netstat, ss

博客参考地址:

http://blog.csdn.net/whuslei/article/details/6667471