⑴ tcp/ip 源碼剖析 怎麼樣
先認清你自己學習的出發點吧, 是應用層面方向還是內核協議棧
應用層面,我不是很了解
內核協議棧個人學習流程大概如下:
首先看TCP/IP卷2,理解2層(MAC地址), 3層(IP, 路由),4層(TCP,UDP,ICMP,IGMP)
這里主要理解的框架,先把網路協議層從下到上(或從上到下)理一遍
然後,建議你看<深入理解linux網路技術內幕> 能看英文版最好
按照那本書的目錄,找找網上的資料
稍微理解下sk_buff和net_device這兩個結構
(不要想著去看懂, 要完全看懂這個結構,會花費比較多的時間,而且還要結合網路子系統中的各個應用)
然後,直接把整本書完整看一遍,不要刻意去扣細節,第1遍看這本書只是為了把網路子系統的內部框架建立起來
看完1遍,肯定有自己的見解了,然後,再根據自己需要的,去扣代碼細節
代碼方面,建議不要找最新的代碼,我看這本書選的2.6.16的,最新代碼的話,和這本書對應不上,不便於理解基礎
<深入理解Linux網路技術內幕> 這本書,除了沒有TCP/UDP的詳細解說,至少我沒發現比他還好的書
⑵ tcp/ip共享資源系統源碼
【問題描述】: 電腦運行慢,操作起來電腦需要反映一段時間。 【原因分析】: 虛擬內存不能及時釋放,虛擬內存設置較小,硬體溫度過高。 【簡易步驟】: 1、【軟體小助手】中的【一鍵加速】 2、【功能大全】中的【魯大師】 3、手動檢查虛擬內存 【解決方案】 1、【軟體小助手】中的【一鍵加速】/span> 2、【功能大全】中的【魯大師】 3、手動檢查虛擬內存
⑶ tcpmp源碼下載
http://download.chinaunix.net/search/?q=tcpmp&frmid=0
⑷ 如何偽造tcp數據包,並進行正確的校驗的例子演示及源碼
下面的程序是在linux下進行tcp偽造的一個例子:涉及原始套接字和tcp的校驗演算法
/************************tcp_pseudo.c********************/
/** Author :cbchen. */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define INTERFACE "eth0"
#define IP ""
/*Prototype area*/
int Open_Packet_Socket();
int Open_Raw_Socket();
int Set_Promisc(char *interface, int sock);
void send_tcp_ack(int sockfd,struct sockaddr_in *addr);
unsigned short check_sum(unsigned short *addr,int len);
struct ip *iprecv;
struct tcphdr *tcprecv;
struct sockaddr_in addr;
int main()
{
int sockfd,sendfd,bytes_recieved;
char buffer[1518];
u_char *buf2;
char saddr[20],daddr[20];
sockfd=Open_Packet_Socket();
sendfd=Open_Raw_Socket();
//printf("sockfd:%d/tsendfd:%d/n",sockfd,sendfd);
int on=1;
/******** 設置IP數據包格式,告訴系統內核模塊IP數據包由我們自己來填寫 ***/
setsockopt(sendfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
Set_Promisc(INTERFACE, sockfd);
int count=1;
while(1)
{
bytes_recieved = recvfrom(sockfd, buffer, 1518, 0, NULL, NULL);
buf2=buffer;
buf2+=14;
iprecv=(struct ip *)buf2;
//iprecv+=sizeof(struct ethhdr*);
/*See if this is a TCP packet*/
if(iprecv->ip_v == 4&iprecv->ip_p == 6) {
printf("---------------------------Number %d packet-----------------------------------------------/n",count);
count++;
printf("/nBytes received ::: %5d/n",bytes_recieved);
printf("ip version:%u/n",iprecv->ip_v);
printf("IP包頭解碼:/n");
printf("Source ip:%s/t",inet_ntoa(iprecv->ip_src));
printf("Dest ip:%s/t",inet_ntoa(iprecv->ip_dst));
printf("proto:%u/n",iprecv->ip_p);
buf2+=iprecv->ip_hl<<2;
printf("TCP包頭解碼:/n");
tcprecv = (struct tcphdr*)buf2;
//tcprecv = (struct tcphdr *)(buffer + (iprecv->ip_hl<<2));
printf("Source port :::%d/n",ntohs(tcprecv->source));
printf("Dest port :::%d/n",ntohs(tcprecv->dest));
printf("seq num:%u/n",ntohl(tcprecv->seq));
printf("ack num:%u/n",ntohl(tcprecv->ack_seq));
printf("urg:%x/tack:%x/tpsh:%x/trst:%x/tsyn:%x/tfin:%x/n",tcprecv->urg,tcprecv->ack,tcprecv->psh,tcprecv->rst,tcprecv->syn,tcprecv->fin);
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
//addr2.sin_port=htons(thdr->source);
addr.sin_port=tcprecv->source;
//addr2.sin_addr=iphdr->ip_src;
addr.sin_addr=iprecv->ip_src;
/********* 發送阻隔包了!!!! ****/
if(tcprecv->syn==1&tcprecv->urg!=1&tcprecv->ack!=1&tcprecv->psh!=1&tcprecv->rst!=1&tcprecv->fin!=1)
{
//send_tcp_ack(sendfd,&addr);
//printf("It's a syn pocket!/n");
}
}
}
close(sockfd);
close(sendfd);
}
//end main
/******* 發送阻隔包的實現 *********/
/*
void send_tcp_ack(int sockfd,struct sockaddr_in *addr)
{
struct send_tcp
{
struct iphdr ip;
struct tcphdr tcp;
} send_tcp;
struct pseudo_header
{
unsigned int source_address;
unsigned int dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
struct tcphdr tcp;
} pseudo_header;
int tcp_socket;
struct sockaddr_in sin;
int sinlen;
// form ip packet
send_tcp.ip.ihl = 5;
send_tcp.ip.version = 4;
send_tcp.ip.tos = 0;
send_tcp.ip.tot_len = htons(40);
send_tcp.ip.frag_off = 0;
send_tcp.ip.ttl = 64;
send_tcp.ip.protocol = IPPROTO_TCP;
send_tcp.ip.check = 0;
send_tcp.ip.saddr = iprecv->ip_dst.s_addr;
send_tcp.ip.daddr = addr->sin_addr.s_addr;
// form tcp packet
send_tcp.tcp.dest = addr->sin_port;
send_tcp.tcp.source = tcprecv->dest;
send_tcp.tcp.ack_seq = htonl(ntohl(tcprecv->seq)+0x01);
send_tcp.tcp.res1 = 0;
send_tcp.tcp.doff = 5;
send_tcp.tcp.fin = 0;
send_tcp.tcp.syn = 1;
send_tcp.tcp.rst = 0;
send_tcp.tcp.psh = 0;
send_tcp.tcp.ack = 1;
send_tcp.tcp.urg = 0;
send_tcp.tcp.res2 = 0;
send_tcp.tcp.window = htons(512);
send_tcp.tcp.check = 0;
send_tcp.tcp.urg_ptr = 0;
send_tcp.tcp.seq = tcprecv->seq;
// set fields that need to be changed
//send_tcp.tcp.source++;
send_tcp.ip.id = 0 ;
//send_tcp.tcp.seq++;
send_tcp.tcp.check = 0;
send_tcp.ip.check = 0;
// calculate the ip checksum
send_tcp.ip.check = in_cksum((unsigned short *)&send_tcp.ip, 20);
// set the pseudo header fields
pseudo_header.source_address = send_tcp.ip.saddr;
pseudo_header.dest_address = send_tcp.ip.daddr;
pseudo_header.placeholder = 0;
pseudo_header.protocol = IPPROTO_TCP;
pseudo_header.tcp_length = htons(20);
b((char *)&send_tcp.tcp, (char *)&pseudo_header.tcp, 20);
send_tcp.tcp.check = in_cksum((unsigned short *)&pseudo_header, 32);
sinlen = sizeof(sin);
int count;
for(count=0;count<2;count++){
if(sendto(sockfd, &send_tcp, 40, 0, (struct sockaddr *)addr,sizeof(struct sockaddr))<0)
{
printf("sendto error!/n");
}
else
{
printf("send packet ok!/n");
}
}
*/
/* 下面是首部校驗和的演算法 */
unsigned short in_cksum(unsigned short *addr, int len) /* function is from ping.c */
{
register int nleft = len;
register u_short *w = addr;
register int sum = 0;
u_short answer =0;
while (nleft > 1)
{
sum += *w++;
nleft -= 2;
}
if (nleft == 1)
{
*(u_char *)(&answer) = *(u_char *)w;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return(answer);
}
int Open_Packet_Socket()
{
int sock;
sock=socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL));
if (sock==-1)
{
perror("socket");
exit(errno);
}
printf("sockfd:%d/n",sock);
return(sock);
}
int Open_Raw_Socket()
{
int sock;
sock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
if (sock==-1)
{
perror("socket");
exit(errno);
}
printf("sendfd:%d/n",sock);
return(sock);
}
int Set_Promisc(char *interface, int sockfd )
{
struct ifreq ifr;
strncpy(ifr.ifr_name,interface,strnlen(interface)+1);
if (ioctl(sockfd,SIOCGIFFLAGS,&ifr)==-1)
{
perror("ioctl1");
exit(errno);
}
ifr.ifr_flags |= IFF_PROMISC;
if (ioctl(sockfd,SIOCSIFFLAGS,&ifr))
{
perror("ioctl2");
exit(errno);
}
// printf("Setting interface ::: %s ::: to promisc...ok..../n", interface);
return(1);
}
⑸ 求TCP/IP 源代碼 要求有中文注釋~~~~~
lz說的應該不是協議,而是實現TCP/IP協議內容的具體代碼,如C語言等;《用TCP/IP進行網際互聯第二卷:設計、實現與內核》(第三版)【Internetworking
With
TCP/IP
Vol
II:Designed,Implementation,and
Internals
Third
Edition】上有C代碼實現,但沒有中文注釋,只有英文注釋,我想應該沒有中文注釋教材的吧,有也不好找的,反正我沒見過,呵呵!
⑹ 求 基於java的Modbus/TCP協議 源代碼
public static void TestModbus() throws Exception{
IpParameters params = new IpParameters();
params.setHost("localhost");//地址
params.setPort(502);//埠
ModbusFactory factory = new ModbusFactory();
ModbusMaster master = factory.createTcpMaster(params, true);
// 初始化
try {
master.init();
readHoldingRegistersTest(master,1,0,3);
} catch (ModbusInitException e) {
e.printStackTrace();
} finally {
master.destroy();
}
}
public static void main(String[] args) {
try {
TestModbus();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private static void readHoldingRegistersTest(ModbusMaster master,
int slaveId, int start, int len) {
try {
// ReadInputRegistersRequest request = new ReadInputRegistersRequest(
// slaveId, start, len);
// ReadInputRegistersResponse response = (ReadInputRegistersResponse) master
// .send(request);
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
slaveId, start, len);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master
.send(request);
if (response.isException()) {
System.out.println("Exception response: message="
+ response.getExceptionMessage());
} else {
ByteQueue byteQueue= new ByteQueue(12);
response.write(byteQueue);
System.out.println(byteQueue);
System.out.println(Arrays.toString(response.getShortData()));
short[] list = response.getShortData();
for(int i = 0; i < list.length; i++){
System.out.print(list[i] + " ");
}
}
} catch (ModbusTransportException e) {
e.printStackTrace();
}
}
⑺ 哪裡有 TCP/IP詳解卷二:實現 程序的源代碼
http://download.csdn.net/detail/fksec/4663609
⑻ tcp/ip協議詳解都是具體的代碼嗎
概括的說TCP/IP協議是(傳輸控制協議/網間協議)TCP/IP 協議集確立了 Internet 的技術基礎。全稱Transmission Control Protocol/Internet Protocol。中譯名為傳輸控制協議/網際網路互聯協議,又名網路通訊協議,是Internet最基本的協議、Internet國際互聯網路的基礎,由網路層的IP協議和傳輸層的TCP協議組成。TCP/IP 定義了電子設備如何連入網際網路,以及數據如何在它們之間傳輸的標准。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。而IP是給網際網路的每一台電腦規定一個地址。
診斷TCP IP協議網路故障時可能會使人灰心喪氣,不過也充滿了樂趣。傳統的TCP IP協議網路故障我們已經大致了解,但其另一種方法結構化的方法很多人都不太清楚。下面,我們就來看看其故障診斷的方法。
通常,TCP IP協議網路故障的結構化診斷的方法由三個關鍵部分組成:
一、診斷故障措施
(1)驗證有關客戶端和伺服器端的路由選擇的連通性
要使用ping,pathping,tracert,或其它類似的工具,便於在網路層上驗證端到端的TCP IP的連接性;採用數據包嗅探以監視傳輸層會話;使用nslookup,telnet和其它的工具來診斷包括域名解析問題、身份驗證等應用層問題。
(2)驗證有關客戶端、伺服器和網路架構硬體的物理媒體
檢查電纜,確保網路適配器正確安裝,並進一步查找、驗證可以顯示媒體斷開狀態的網路連接。
(3)驗證有關客戶端、伺服器、網路架構硬體的TCP IP協議配置
在客戶端上這意味著檢查IP地址、子網掩碼、默認網關、DNS設置等等。對於網路架構硬體而言,也就是指路由器上的路由表和Internet網關。
二、幾個方面的因素
標志性信息:客戶端機器上的出錯消息,登錄對話框等等。
期間:連續的、間斷的,還是偶爾的,何時開始等。
出現問題的連接類型:物理層、網路層、傳輸層還是應用層?身份驗證還是訪問控制等等。
其間的網路:線纜(如果不是無線的話)、集線器、交換機、路由器、防火牆、代理伺服器,以及客戶端和伺服器之間的其它網路架構。
范圍:一個或多個有關的客戶端/伺服器端。
客戶端:即出現問題的客戶端
伺服器端:客戶無法訪問的伺服器、列印機或其它的網路資源(如互聯網)等。
環境:可能會影響你的網路的外部情況,如電源的波動、建築物的維護等等。
三、理解和方法
(2)問一些恰當的問題對故障診斷很關鍵
要學會何時按部就班,何時以跳躍性思維直奔主題是故障診斷藝術的本質所在,這還括充分使用你的左右腦
,即要有充分的想像和縝密的思維。
(3)踏踏實實地測試,並隔離問題
⑼ 求一C語言寫的tcp程序的源碼,程序越簡單越好,C++也可以,最好帶注釋
最簡單的那種?我給你寫一個=,=
//伺服器
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
main()
{
//創建套接字
int serverSocket= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
int addr_len = sizeof(clientAddr);
int client;
char buffer[200];
//創建地址
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(5555);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//綁定
bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
//幀聽
listen(serverSocket,5);
printf("客戶端發過來的 :\n");
//接收
client=accept(serverSocket,(sockaddr *)&clientAddr,(socklen_t*)&addr_len);
printf("客戶端發過來的 :\n");
while(1)
{
if(recv(client,buffer,sizeof(buffer),0)>0)
printf("客戶端發過來的 : %s\n",buffer);
}
return 0;
}
//客戶端
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
main()
{
struct sockaddr_in serverAddr;
int clientSocket=socket(AF_INET,SOCK_STREAM,0);
char sendbuf[200];
//創建地址信息
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(5555);
serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
//連接伺服器
connect(clientSocket,(sockaddr*)&serverAddr,sizeof(serverAddr));
printf("連接目標主機中.....\n連接完成......\n");
//
while(1)
{
printf("請輸入發給伺服器的數據 : ");
scanf("%s",sendbuf);
//strcmp函數作用,比較兩個東東(按ASCII值大小相比較),相同就==0。
if(strcmp(sendbuf,"x")==0)
break;
send(clientSocket,sendbuf,sizeof(sendbuf),0);
}
close(clientSocket);
return 0;
}
⑽ 求c語言編程的Modbus TCP源代碼
從機的可以用freemodbus,我用過RTU的,很好用。
TCP的沒用過,但freemodbus的代碼格式很清晰,移植起來很簡單。
http://www.modbus.org/tech.php
另外可以去MODBUS的網站上找找,看有沒有合適的庫可以用。