Tuesday, October 27, 2015

Socket Programming with Python - Part 1 (Simple HTTP web server)

Socket Programming with Python ලිපි මාලාවක් විදියට ඉදිරිපත් කරන්න මම බලාපොරොත්තු වෙනවා. web browser හා වෙනත් ඉන්ටෙර්නෙට් 1ක හරහා communicate කරන program 1ක් වැඩ කරන්නේ protocol stack 1ක උඩ. protocol stack 1කේ network layer 1ක අදුරගන්න ip address තියෙනවා. Host computer 1ක ip address 1ක දැනගත්තම  අපට පුළුවන් ඒ Host computer 1ට data යවන්න. Web browser 1ක් බලපුවම 1ක තියෙන්නේ application layer 1කේ, මේ application layer 1ක ඇතුලත HTTP, SMTP වගේ protocol තියෙනවා. application layer 1ක හා network layer 1ක අතර Transport Layer 1ක තියෙනවා. Network 1ක හරහා එන data application 1ට ලැබෙන්නේ Transport Layer 1ක හරහා. Transport Layer 1ට application කිහිපයක් connect උනාම Transport Layer 1න් මේ application වෙන වෙනම අදුරගන්න application 1ට address 1ක් දෙනවා, මෙන්න මේ address 1ට port number 1ක කියල කියනවා. අපේ පරිගණකයේ application 1කේ IP:Port combination 1ක් හා host පරිගණකයේ IP:Port combination 1න් විවර වෙන connection 1ට සරලව Socket 1ක් කියනවා. Transport Layer 1ක කොටස් 2ක එකතුවක්. ඒ Transmission Control Protocol (TCP)  හා User Datagram Protocol (UDP). TCP connection oriented protocol 1ක් කියලත් කියනවා, එකට හේතුව වෙන්නේ TCP මුලින්ම connection 1ක හදාගෙන ඒ හදාගත්ත pipe 1ක හරහා communicate කරනවා. UDP connection less protocol 1ක් විදියට හදුන්වනවා. 


Socket API 1ක පහත methods ටික ලබා දෙනවා.
SOCKET method 1න් කරන්නේ අලුත් instanse 1ක් හදාගන්න 1ක.
SEND , RECEIVE method data යවන්න හා ලබාගන්න බාවිතා කරනවා.
CONNECT method 1ක මගින් client application 1ක server application 1ත් සමග connection 1ක හදාගන්නවා.
BIND method 1න් server application 1ක IP:PORT 1ක් ලබාදෙනවා. server application 1කේ IP:PORT දන්නා ඕනෑම කෙනෙකුට server 1ට data එවන්න පුළුවන්.

LISTEN මගින් server 1ක සම්බන්දතා ඇති කරගන්න කැමති ප්‍රමාණය කියනවා. ACCEPT මගින් server application 1ක හා client application 1ක අතර connection 1ක් හදාගන්නවා.

සරල client server application 1ක් වැඩකරන හැටි දැන් බලමු.
soc = socket.socket() මගින් අලුත් socket instanse 1ක් හැදෙනවා. මේ soc 1ක TCP වර්ගයට අයත් socket instanse 1ක්.soc.bind(address) මගින් server 1ට IP:PORT 1ක් ලබාදෙනවා.මෙහි address 1ක HOST/IP ,PORT tuple 1ක් විදියට දෙන්න ඕනි. HOST 1ට empty string 1ක් දුන්නම ඕනෑම IP 1න් එන request බාරගන්නවා.
soc.listen(1) මගින් client application 1ට පමණක් ඇහුන්කන් දෙනවා. soc.accept() මගින් server application 1ක client application 1ත් සමග connection 1ක් හදාගන්නවා. ඒ connection 1ක පිළිබද සියලුම විස්තර remort_soc variable 1ට assign වෙනවා. client application 1ට data යැවීමට හා ලබාගැනීමට remort_soc උපකාරී වෙනවා. පහත රුපයේ විදියට remort_soc.recv හා remort_soc.send while loop 1ක් ඇතුලත තියෙන්න ඕනි. මොකද client application 1ක, 1ක් වතාවකට වැඩියෙන් server 1ට data එවන නිසා. මේ උදහරනයේදී client application 1න් එවන string capital letters වලට හරවල එම string 1ම client application 1ට යවනවා. අවසානයේදී open කරපු socket 1ක close කරන්න ඕනි.
Client application 1ක සලකනකොට අලුත් socket instanse 1ක් හදාගන්න ඕනි. soc.connect((HOST,PORT)) මගින් client application 1ක server 1ට connect කරන්න ඕනි. soc.send හා soc.recv මගින් server 1ට data යවන්න හා ලබාගන්න පුළුවන්. මෙහි input මගින් user න් input ලබාගන්නවා, මේ ලගන්න input තම server 1ට යවන්නේ. String, Images හෝ වෙනත් ඕනෑම දෙයක් server න් client ට හෝ අනෙත් දිශාවට යැවීමට පෙර byte වලට හැරවිය යුතුයි.

Application 2ක වැඩකරන විට පහත විදියට බලාගන්න පුළුවන්.

දැන් server application 1කේ send data string 1ක මේ විදියට edit කරන්න,

HTTP/1.1 200 OK\nContent-Length: 32\ncontent-type:text/html; charset=UTF-8\n\n<html><body>My first Server test</body></html>. Server 1ක run කරලා ඔයාලගේ browser 1කේ url 1ක localhost:9998 විදියට type කරලා මොකද වෙන්නේ බලන්නකෝ. ඉතිරි ටික ඊලග ලිපියෙන් ඔයාලට ගේන්නම්.



Tuesday, October 13, 2015

Ping හා Tracerout/Tracert

Ping හා Tracerout/Tracert කියන්නේ මොකක්ද, මේවා වැඩ කරන්නේ කොහොමද කියල. පළමුවෙන් බලමු ping command 1ක ගැන. ping 1න අපිට පුළුවන් අපි ලබාදෙන IP address 1ක network 1කේ තියෙනවද ඒ IP address 1ට data යවන්න පුලුවන්ද හා අපි යවන data accept කරනවද කියල දැනගන්න. Networking වල troubleshooting වලට බවිත කරන මුලික tool 1ක් තම ping කියන්නේ. Linux, Windows සමග ping command 1ක එනවා.
ping IP_address හෝ ping domain_name විදියට ping command 1ක බවිත කරන්න පුළුවන්.

Ping command 1ක වැඩ කරන්නේ ICMP (Internet Control Message Protocol) 1ක උඩ. ICMP කියන්නේ error-reporting protocol 1ක්. ICMP ගැන වැඩි විස්තර https://goo.gl/hNXWih මෙතනින් කියවන්න පුළුවන්. ICMP 1ක ICMP Type ගොඩක එකතුවක්, මේ ICMP Type තවත් අනු කොටස් වලට බෙදෙනවා. මේ අනු කොටස් ICMP Code කියල හදුන්වනවා. උදාහරණයක් විදියට ICMP Type 3 ගමු, ICMP Type 3 කියන්නේ Destination Unreachable කියන message 1ක. ICMP Type 3 යටතේ ICMP Code 16 (0-15) ක් තියෙනවා. ICMP Code කිහිපයක් බැලුවොත්,
ICMP Code 0 - Destination network unreachable
ICMP Code 1 - Destination host unreachable
ICMP Code 15 - Precedence cutoff in effect
පහත රුපයේ බලාගන්න පුළුවන් ICMP protocol IP header 1කේ හැඩය.

මේ ICMP Type අපට පුළුවන් කොටස් 2ට බෙදන්න. ඒ Query/Response හා Error message කියල. ICMP Type 3,4,5,11,12 error message type.

ඉහතින් මම කිව්වා ping command 1ක ICMP බාවිතා කරනවා කියල. ping ICMP Type 0 - Echo reply හා ICMP Type 8 - Echo request බාවිතා කරනවා. ping command 1ක ප්‍රථමයෙන්ම ICMP Type 8 - Echo request 1ක් අපි දෙන IP Address 1ට යවනවා. (Domain Name 1ක දුන්නොත් DNS මගින් ඉස්සල්ලම IP Address 1ක හොයාගන්නවා) ඒ data packet 1ක දෙන destination 1ට ගියොත් එතනින් ICMP Type 0 - Echo reply 1ක් එවනවා.පහත රුප වලින් network 1ක තුල data packet pass වෙන විදිය බලාගන්න පුළුවන්. මම Microsoft Network Monitor 3.4 මේ සදහා බවිත කරා මොකද මේ tool 1ක internet dongle support කරනවා.(Wireshark මේ වැඩේට ගොඩක් හොද tool 1ක් ඒ උනාට internet dongle support කරන විදිය මට හොයාගන්න බැරි උන.)

දැන් බලමු Tracerout/Tracert ගැන. Linux වල Tracerout විදියටත් windows වල Tracert විදියටත් මේ tool 1ක එනවා. මේකත් networking වල troubleshooting වලට බවිත කරන tool 1ක්. Tracert වලට අමතරව windows වල PingPath කියල tool 1ක් තියෙනවා මේහා සමාන. මේ tool 1ක් අපි internet 1ක හරහා යවන request 1ක් hop(routers) කියක් පහුකරලා යනවද කියල බලාගන්න පුළුවන්. Tracerout/Tracert ත් ICMP මත implement කරලා තියෙන tool 1ක්. Tracerout/Tracert command 1ක  පහත විදියට බාවිතා කරන්න පුළුවන්.
Tracerout/Tracert IP_Address හෝ Tracerout/Tracert Domain_Name

Tracerout/Tracert ICMP Type 0 - Echo Reply, ICMP Type 8 - Echo request හා ICMP Type 11 - Time Exceeded කියන Type ටික බාවිතා කරනවා. ICMP Type 11 වලදී ICMP protocol IP header 1ට TTL (Time-to-Live) value 1ක් එකතු කරනවා. TTL සමහර විට hope limite කියලත් හදුන්වනවා.
මුලින්ම Tracerout/Tracert ICMP Type 8 data packet 1ක් යවනවා, මේකේ TTL value 1ක '1'. මේ packet 1ක පලවෙනි hop 1ට ගියාම TTL value 1ක් check කරනවා, TTL value 1ක '1' නම් hop 1ක ICMP Type 11 - Time Exceeded message 1ක් යවනවා ඒවගේම මේ packet 1ක 1න් විනාශ කරනවා ඊලග hop වලට නොයවා.
මීලගට Tracerout/Tracert මගින් 2 TTL value විදියට තියෙන packet 1ක් යවනවා, පෙර විදියටම පළමු hop 1දී TTL value 1ක් check කරනවා, මේ අවස්ථාවේදී TTL value > 1 නිසා TTL value 1න් '1' අඩු කරලා ඉලග hop 1ට යවනවා, මෙවිට TTL value = 1 නිසා නැවතත් ICMP Type 11 - Time Exceeded message 1ක් Tracerout/Tracert tool 1ට යනන්ව. Tracerout/Tracert මගින් ICMP Type 11 message 1ක් ලැබෙන හැම අවස්ථාවකම TTL value 1ක '1'න් වැඩි කරමින් request message යවනවා. මේ විදියට යනකොට ICMP Type 0 - Echo Reply බවිතවෙන්නේ කොහෙද කියල ප්‍රශ්නයක් එනවනේ. අපි දෙන IP  Address 1ට ඒ කියන්නේ destination 1ට data packet 1ක ගියපුවාම destination 1න් source 1ට ICMP Type 0 - Echo Reply 1ක් එවනවා.පහත රුප වලින් network 1ක තුල data packet pass වෙන විදිය බලාගන්න පුළුවන්. Windows වලදී නම් TTL value 1ට packet 1යි යවන්නේ, ඒ උනාට Linux වලදී වගේ TTL value 1ට packet 3 යවනවා. ඒ වගේම default TTL value 1ක තම 30, hop 30 ඇතුලත packet 1ට destination 1ට යන්න බැරි උනොත් Tracerout/Tracert 1ක fail වෙනවා.