TCP/IP网络编程之TCP

TCP字节流与UDP数据报的区别

参考链接 http://www.linuxidc.com/Linux/2014-11/109545.htm

TCP/IP协议栈分为四层

TCP/IP网络编程之TCP_第1张图片

链路层

也称作数据链路层或网络接口层,通常包括网络接口卡与设备驱动,链路层是物理链接领域标准化结果。若两台计算机通过网络进行数据交换,链路层就负责整个物理连接。

网络层

也称作互联层,负责在复杂的网络中传输数据时的路径的选择,并提供数据报服务,由于IP本身是面向消息的、不可靠的协议。虽然每次传输数据时会帮我们选择路径,但是并不一致,传输过程中一旦出现路径错误,则选择其他路径。如果发生数据丢失或错误则无法解决,IP协议无法应对数据错误。

传输层

包括TCP与UDP,网络层负责点到点的传输(主机或路由器之间的传输),而传输层负责端到端的传输(主机中进程之间的传输)。其中,TCP协议可以保证传输数据的可靠性。

IP层只关注一个数据包的传输过程。因此,即使传输多个数据包,每个数据包也是由IP层实际传输的。也就是说,传输的顺序及传输本身不可靠的。若只利用IP层传输数据,则有可能导致后传输的数据包比先传输的数据包先到达目的地。也有可能在传输的过程中丢失或损毁,反之如果添加TCP协议(传输控制协议)的话就不会出现这种情况。

参考连接 http://java-mzd.iteye.com/blog/1007577

总之,TCP和UDP存在于IP层之上,决定主机之间的数据传输方式,TCP确认之后向不可靠的IP协议赋予可靠性。

应用层

套接字通信过程是自动处理的。选择数据传输路径、数据确认过程都被隐藏到套接字内部。总之,向各位提供的工具就是套接字,大家只需利用套接字编写程序即可。编写软件的过程中,需要根据程序特点决定服务端和客户端之间的数据传输规则,这便是应用层的协议。

 OSI参考模型与TCP/IP参考模型对比

TCP/IP网络编程之TCP_第2张图片


TCP服务器端函数调用顺序

Socket -> bind -> listen -> accept -> read/write -> close

服务器端的等待连接请求状态

在服务器端调用了bind函数为套接字分配了IP地址和端口号后,应该调用函数listen进入等待连接请求状态,只有服务器端调用了listen函数客户端调用connect函数时才能连接上服务器端。

客户端在请求连接时,在连接被受理前一直处于等待状态,客户端的连接请求将被放到连接请求等待队列(连接未完成的缓冲队列,其内是未决连接),listen的第二个参数决定了等待队列的大小(当连接的数量大于队列大小时,未进入队列的连接会自动重连直到57秒后),当服务器端准备好服务器端套接字和连接请求等待队列后(即调用listen后)的可接收连接请求的状态被称为等待连接请求状态。

参考连接:http://blog.chinaunix.net/uid-17102734-id-2830185.html                                                

http://blog.csdn.net/wm_1991/article/details/52176287

http://blog.sina.com.cn/s/blog_92786dfd0101nq5e.html

http://blog.csdn.net/ordeder/article/details/21551567

服务器端受理客户端的连接请求

受理连接请求意味着进入可接收数据状态:accept函数从listen的等待队中取出一个,接收数据的套接字由函数accept内部自动创建并返回其文件描述符,被accept函数创建的套接字自动与发起连接请求的客户端建立连接,使用新建立的套接字与客户端进行数据交换, 如果等待队列中无等待的连接,那么accept可能会进入阻塞状态(视套接字类型而定)直到有客户端请求连接

int accept(int sockfd, struct sockaddr* addr, socklen_t* len)             //成功时返回创建的套接字的文件描述符,失败返回-1

//参数sockfd为服务器端创建的用于listen与bind的监听套接字 参数addr指向存储客户端地址信息的变量的指针          参数len描述第二个参数addr结构体的长度,需传递含有具体结构体长度的变量的地址

参考链接:http://ticktick.blog.51cto.com/823160/779866

http://blog.csdn.net/david_xtd/article/details/7087843

TCP客户端函数调用顺序:

Socket -> connect -> read/write -> close

服务器端是调用listen函数后等待连接,客户端是调用函数connect请求连接

int connect (int sockfd, struct sockaddr * serv_addr, socklen_taddrlen);         //成功时返回0 失败时返回-1

//参数sockfd 客户端套接字文件描述符          参数serv_addr指向存有服务器地址信息的变量的指针   参数addrlen描述第二个参数serv_addr结构体的长度

该函数在服务器端接收连接请求或者发生异常中断连接请求时返回(注意:接收连接请求不是服务器调用accept函数,而是服务器端将连接请求加入到等待队列,因此函数返回后不一定能进行数据交换)

其实客户端的套接字也被分配了服务器端的IP地址与端口,这一分配的过程发生在调用connect函数时,由操作系统内核完成

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(TCP/IP网络编程)