您的位置:首页 > 理论基础 > 计算机网络

TCP/IP三次握手

2017-02-20 17:17 246 查看
TCP/IP协议族

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中。

ISO七层 TCP/IP四层



 

 应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
  传输层:TCP,UDP
  网络层:IP,ICMP,OSPF,EIGRP,IGMP
  数据链路层:SLIP,CSLIP,PPP,MTU

  每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的



socket

我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。



三次握手的过程:



TCP Socket
基于TCP协议的客户端/服务器程序的一般流程一般如下:



服务器端示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXLINE 80
#define SERV_PORT 8000

int main(void)
{
char buf[MAXLINE];

int listenfd = 0;
listenfd = socket(AF_INET, SOCK_STREAM, 0);

sockaddr_in servaddr = {0};
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

bind(listenfd, (sockaddr *)&servaddr, sizeof(servaddr));
listen(listenfd, 20);

printf("Accepting connections ...\n");
while (1)
{
sockaddr_in cliaddr = {0};
socklen_t cliaddr_len = sizeof(cliaddr);
int connfd = accept(listenfd, (sockaddr *)&cliaddr, &cliaddr_len);

char str[INET_ADDRSTRLEN];
printf("connected from %s at PORT %d\n",inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),ntohs(cliaddr.sin_port));

while(true)
{
int count = read(connfd, buf, MAXLINE);
if (count == 0)
break;

write(connfd, buf, count);
}

close(connfd);
printf("closed from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));
}
}

客户端代码如下:
#include <stdio.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 8000
#define MESSAGE "hello world"

int main(int argc, char *argv[])
{
char buf[MAXLINE];

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

sockaddr_in servaddr = {0};
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);

if (0 != connect(sockfd, (sockaddr *)&servaddr, sizeof(servaddr)))
{
printf("connected failed");
return 1;
}

write(sockfd, MESSAGE, sizeof(MESSAGE));
int count = read(sockfd, buf, MAXLINE);

printf("Response from server: %s\n",buf);

close(sockfd);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: