TCP状态图与POSIX socket接口

2012-06-02 23:12:31

今天记录一下TCP和socket接口的一些心得:

(一)

关于TCP状态图:

Client端             Server端

Closed                LISTEN

SYN-SEND         SYN-RECV

ESTABLISHED                              #两端都进入此状态,此时可以相互传输数据,全双工

FIN-WAIT1                                   #发送FIN1后

                        CLOSE-WAIT      #收到FIN1,发送ACK1

FIN-WAIT2                                   #收到ACK1,关闭DATA的接收

                        LAST-ACK           #发送FIN2之后

TIME-WAIT                                   #收到FIN2,发送ACK2

    TIMEOUT OR CLOSED            #如果在TIME-WAIT状态超时,则CLOSED,或者LAST-ACK状态收到ACK2,也CLOSED


注意,三次握手,四次挥手。easy to say hi, hard to say good bye!

三次握手,SYN->, SYN+ACK<-, ACK->。四次挥手,FIN->,ACK<-,FIN<-,ACK->。

考虑为何要有三次握手,和四次挥手?

其实对TCP/IP有很多攻击的可能方法,因为一个协议是无法保证百分百不被攻破的。

因此,以前我一直以为主要是为了限制防止IP伪装攻击。现在发现,其实多一两次连接,并没有明显的效果。

现在我认为,之所以需要多次握手是因为要解决,网络延时收包晚造成的资源浪费的问题。

(二)

socket接口,linux的与windows的实现不同,即POSIX的socket实现与winsock是不同的。

socket.h不是C标准库里面的,而是系统相关的,所以在linux 下的头文件为<sys/socket.h>.

同时值得注意的是,有一些常用的基本库函数由于与系统、硬件的相关性,C标准库里并没有包含。