TCP Socket Programming Menggunakan Python

⏱️7 min read

Intro

Beberapa waktu yang lalu saya mendapatkan tugas dari dosen mata kuliah jaringan komputer. Tugas itu dikerjakan secara berkelompok yang terdiri dari 4 orang. Tugasnya adalah TCP dan UDP socket programming. Akhirnya kita membagi tugas, dan kebetulan saya dapat bagian TCP socket programming.

Apa itu TCP?

TCP atau Transmission Control Protocol adalah protokol komunikasi dalam computer networking. TCP berada pada layer transport atau layer ke 4 dari 7 OSI layer. Dalam TCP ada istilah yang namanya 3 Way Handshake. Istilah tersebut merupakan gimana cara berkomunikasi menggunakan TCP. Jadi gini, 3 Way Handshake dimulai dari SYN -> SYN ACK -> ACK

SYN (Synchronize Sequence Number) berarti client ingin membuat koneksi dengan server dengan mengirimkan SYN ke server yang menginformasikan bahwa klien kemungkinan akan memulai komunikasi.

SYN ACK berarti server merespon permintaan client. ACK (Acknowledgement) menandakan respon dari segmen yang diterimanya sedangkan SYN menandakan dengan nomor urut apa yang mungkin untuk memulai segmen.

ACK berarti client mengirim konfirmasi ke server bahwa client telah menerima SYN, dan keduanya membangun koneksi.

TCP vs UDP

  • TCP

    • Definisi : TCP adalah communication-based protocol. Transmisi data terjadi dalam bentuk paket. TCP mencakup teknik pengecekan kesalahan, menjamin pengiriman data, dan menjaga urutan paket data dan informasi.
    • Desain : connection-oriented.
    • Transmisi Data : Terjadi dalam urutan tertentu. Paket data tiba dalam urutan yang diinginkan di penerima.
    • Kecepatan : Lebih lambat dari UDP.
    • Efisiensi : Kurang efisien dibandingkan dengan UDP.
    • Retransmisi : Dimungkinkan untuk mengirim ulang data dalam TCP jika ada paket yang hilang dalam proses transmisi.
    • Jaminan Pengiriman : TCP menjamin pengiriman data ke penerima/router tujuan.
    • Urutan Data : TCP mampu mengurutkan data. Ini mengatur ulang paket data dalam urutan tertentu.
    • Ukuran Header : 20 bytes.
    • Broadcasting : Tidak support broadcasting.
    • Metode Transfer : TCP membaca data menggunakan sistem byte. Setiap pesan ditransmisikan ke batas segmen.
    • Reliability(Keandalan)* : TCP menjamin pengiriman data ke rute tujuan dan menawarkan dukungan untuk pengecekan kesalahan. Lebih dapat diandalkan dibandingkan dengan protokol UDP.
    • Acknowledgment segments : Punya.
    • Handshake Protocol : TCP menggunakan three-way handshake untuk membangun koneksi seperti SYN-ACK, SYN, ACK, dll.
    • Contoh Penggunaan : Transver Services, POP, SMTP, FTP, HTTP, HTTPS, dll
  • UDP

    • Definisi : UDP mirip dengan protokol TCP. Tapi itu tidak menjamin pemulihan data dan layanan pengecekan kesalahan. Jika menggunakan protokol ini, data akan terus dikirim, terlepas dari masalah apa pun dengan penerima.
    • Desain : connectionless.
    • Transmisi Data : Tidak terjadi.
    • Kecepatan : Lebih cepat dari TCP.
    • Efisiensi : Lebih efisien dibandingkan dengan UDP.
    • Retransmisi : Tidak dimungkinkan untuk mengirim ulang data.
    • Jaminan Pengiriman : Tidak menjamin pengiriman data ke penerima/router tujuan.
    • Urutan Data : UDP tidak mampu mengurutkan data. Tidak memiliki urutan tetap, dan semua paket tetap independen satu sama lain.
    • Ukuran Header : 8 bytes.
    • Broadcasting : Support broadcasting.
    • Metode Transfer : Paket UDP memiliki batasan yang ditentukan. Ia mengirimkan setiap paket satu per satu dan memeriksa integritas data pada saat kedatangannya.
    • Reliability(Keandalan)* : TUDP menawarkan dukungan hanya untuk pemeriksaan kesalahan dasar menggunakan blok data checksum.
    • Acknowledgment segments : Tidak unya.
    • Handshake Protocol : Tidak ada karena sonnectionless.
    • Contoh Penggunaan : Streaming Service, Video Stream, VOIP, DNS, dll

Mari Kita Coba

Untuk flow koneksinya seperti berikut. 1

TCPServer.py

import socket

# Inisialisasi pemuatan soket dan menunggu koneksi


server_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#mengset soket ke alamat lokal,
#Isiannya sepasang yaitu (host,host harus diisi alamat lokal yaitu localhost atau 127.0,0,1
server_Socket.bind(('localhost', 12000))

#mengaktifkan server untuk menerima koneksi.
#Argumen backlog harus di isi minimal0 (jika lebih rendah, akan diset ke 0);
server_Socket.listen(5)

while True:
    print("Server menunggu koneksi")

    #Terima koneksi.
     #Soket harus dii-bind ke sebuah alamat dan listening koneksi.
    #Return value nya adalah sepasang (conn, address) di mana conn adalah objek
    #soketang dapat digunakan untuk mengirim dan menerima data pada sambungan,
    #dan address adalah alamat yang tke soket di ujung sambungan lainnya.
    client_Socket,addr = server_Socket.accept()


    # memulai mendengarkan  TCP request yang akan datang
    print("koneksi klien dari ",addr)
    while True:
        data = client_Socket.recv(1024)
            if not data or data.decode('utf-8') == 'END':
            break
        print("menerima dari client : ",data.decode("utf-8"))
        try:
            client_Socket.send(bytes('HEy client','utf-8'))
        except:
            print("Keluar")
    client_Socket.close()
server_Socket.close()

Penjelasan TCPServer

import socket

# Inisialisasi pemuatan soket dan menunggu koneksi


server_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#mengset soket ke alamat lokal,
#Isiannya sepasang yaitu (host,host harus diisi alamat lokal yaitu localhost atau 127.0,0,1
server_Socket.bind(('localhost', 12000))

#mengaktifkan server untuk menerima koneksi.
#Argumen backlog harus di isi minimal0 (jika lebih rendah, akan diset ke 0);
server_Socket.listen(5)

Dalam socket programming, pertama yang hrus kita lakkan adalah import module socket. kemudian kita membuat variabel dengan nama server_socket yang isinya kita memanggil addresFamily socket.AF_INET dan jenis soketnya yaitu socket.SOCK_STREAM.

Kemudian kita harus melakukan binding dengan menggunakan method bind. method ini digunakan untukmengset soket ke alamat lokal. Diisi dengan sepasang alamat IP dan port. Kmudian kita akan mengaktifkan server dengan menggunakan function listen(), parameter yang di isi harus lebih besar sama dengan 0. Parameter tersebut digunakan untuk menentukan jumlah koneksi yang tidak diterima yang akan diizinkan oleh sistem sebelum menolak koneksi baru.

while True:
       print("Server menunggu koneksi")

       #Terima koneksi.
       #Soket harus dii-bind ke sebuah alamat dan listening koneksi.
       #Return value nya adalah sepasang (conn, address) di mana conn adalah objek
       #soketang dapat digunakan untuk mengirim dan menerima data pada sambungan,
       #dan address adalah alamat yang tke soket di ujung sambungan lainnya.
       client_Socket,addr = server_Socket.accept()


       # memulai mendengarkan  TCP request yang akan datang
       print("koneksi klien dari ",addr)
       while True:
           data = client_Socket.recv(1024)
           if not data or data.decode('utf-8') == 'END':
               break
           print("menerima dari client : ",data.decode("utf-8"))
           try:
               client_Socket.send(bytes('HEy client','utf-8'))
           except:
               print("Keluar")
       client_Socket.close()
   server_Socket.close()

Masuk ke fase menunggu koneksi. Kita menggunakan infinite-loop. Dalam menerima koneksi (accept()), Soket harus di-bind ke sebuah alamat dan listening koneksi. Return value nya adalah sepasang (conn, address) di mana conn adalah objek soket baru yang dapat digunakan untuk mengirim dan menerima data pada sambungan, dan address adalah alamat yang terikat ke soket diujung sambungan lainnya.

Ketika koneksi ter-establish maka akan print alamat dari client. kemudian kita perlu men-decode payload yang di kirim dan diprint. Ketika koniksi awal ter-establish maka server juga akan mengirim sebuah payload berupa string yang isinya HEy client.

TCPClient.py

import socket

client_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#Hubungkan soket ke remote address.
#Untuk soket IP, alamatnya sepasang (host, port).
client_Socket.connect(('localhost',12000))
payload = 'Halo Serperr' #Payload yang dikirim ke server
try:
   while True:
       client_Socket.send(payload.encode('utf-8')) #mengirim data string ke socket
       data = client_Socket.recv(1024) #Menerima hingga 1024 bytes dari socket
       print(str(data))
       more = input('Mau kirim data lagi?y/n ')
       if more.lower() == 'y':
           payload = input('Masukkan payload yang akan dikirim : ')
       else:
           print ("stop")
           break
except KeyboardInterrupt:
   print("Keluar")
client_Socket.close()

Penjelasan TCPClient

import socket

client_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#Hubungkan soket ke remote address.
    #Untuk soket IP, alamatnya sepasang (host, port).
client_Socket.connect(('localhost',12000))
payload = 'Halo Serperr' #Payload yang dikirim ke server

Sama seperti server pertama-tama kita perlu megimport module dan mendeklarasikan sebuah variabel yang isinya socket.socket(socket.AF_INET,socket.SOCK_STREAM) dan setelah itu kita menggunakan method connect untuk membangun koneksi dengan parameter berisi alamat(ip, dan port). kita juka membuat payload berupa string, yang mana ketika koneksi antara client dan server terbangun maka payload tersebut nantinya akan terkirimkan.

try:
    while True:
        client_Socket.send(payload.encode('utf-8')) #mengirim data string ke socket
        data = client_Socket.recv(1024) #Menerima hingga 1024 bytes dari socket
        print(str(data))
         more = input('Mau kirim data lagi?y/n ')
        if more.lower() == 'y':
            payload = input('Masukkan payload yang akan dikirim : ')
        else:
            print ("stop")
            break
except KeyboardInterrupt:
    print("Keluar")
client_Socket.close()

Kita menggunakan infinite-loop pada fase koneksi dimana client bisa memilih untuk mengirimkan payload lain atau tidak. Ketika client memilih tidak untuk mengirim payload lain maka koneksi akan terputus. Walaupun koneksi terputus, Server akan tetap menyala menunggu koneksi selanjutnya.

Hasil

Dalam menjalankan programnya kita harus memulainya dengan TCPClient.py terlebih dahulu. Jika tidak maka akan muncul error sebagai berikut: 2

Server

3

Client

4