传输控制协议(TCP)
-
TCP 为什么要进行3次握手?
TCP的三次握手最主要是防止已过期的连接会再次传到被连接的主机;
如果采用两次的话,会出现下面这种情况。
比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;
于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。
传完东西后,断开。
结果这时候,原先没有到达的连接信息突然又传到了B机,于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。 -
TCP工作原理
TCP的连接建立过程又称为TCP三次握手;
首先发送方主机向接收方主机发起一个建立连接的同步(SYN)请求;
接收方主机在收到这个请求后向发送方主机回复一个同步/确认(SYN/ACK)应答;
发送方主机收到此包后再向接收方主机发送一个确认(ACK),此时TCP连接成功建立.
一旦初始的三次握手完成,在发送和接收主机之间将按顺序发送和确认段。关闭连接之前,TCP使用类似的握手过程验证两个主机是否都完成发送和接收全部数据。
完成三次握手,客户端与服务器开始传送数据。
用nc来测试连接
客户端 nc 127.0.0.1 3000
服务端 nc -l 3000
socket:对应一个IP一个端口进行点对点通讯
1. 导入头文件
#import <sys/socket.h> //socket相关
#import <netinet/in.h> //internet相关
#import <arpa/inet.h> //地址解析协议相关
2. socket(创建)
int socket(int, int, int);
/**
参数
第一个int:domain: 协议域,AF_INET(IPV4的网络开发)
第二个int:type: Socket 类型, SOCK_STREAM(TCP)/SOCK_DGRAM(UDP,报文)
第三个int:protocol: IPPROTO_TCP,协议,如果输入0,可以根据第二个参数,自动选择协议
返回值
socket,如果 > 0 就表示成功
*/
3. connection (连接到“服务器)
connect(int, const struct sockaddr *, socklen_t)
/**
参数
1> 客户端socket
2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址
服务器的"结构体"地址,C语言没有对象
3> 结构体数据长度
返回值
0 成功/其他 错误代号
*/
4. write(发送数据)
send(int, const void *, size_t, int)
/**
参数
1> 客户端socket
2> 发送内容地址 void * == id
3> 发送内容长度
4> 发送方式标志,一般为0
返回值
如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR
*/
5. read (接收)
recv(int, void *, size_t, int)
/**
参数
第一个int :创建的socket
void *:接收内容的地址
size_t:接收内容的长度
第二个int.:接收数据的标记 0,就是阻塞式,一直等待服务器的数据
返回值
接收到的数据长度
*/
6. close
close(int);
int:就是创建的socket
网友评论