TCP/IP, İnternet'in ve çoğu bilgisayar ağının temelini oluşturan bir protokol yığınıdır. Güvenilir veri teslimatından sorumlu TCP protokolü ile düğümler arasında paket yönlendirmesini sağlayan IP'yi birleştirir. IETF RFC 1180 (2024)'e göre, TCP/IP yığını mobil ve web uygulamaları dahil olmak üzere küresel ağ trafiğinin %80'inden fazlasını işler. Protokol yığını verilerin bir ağdaki cihazlar arasında nasıl paketlendiğini, adreslendiğini ve iletildiğini tanımlar.
Anahtar noktalar
TCP/IP (Transmission Control Protocol / Internet Protocol), 1970'lerde ARPANET için geliştirilmiş ve küresel İnternet için fiili standart haline gelmiş bir protokol yığınıdır. Verilerin paketlere nasıl bölündüğünü, adreslendiğini, iletildiğini ve alıcı tarafında yeniden birleştirildiğini tanımlar.
TCP/IP mimarisi, her katmanın belirli işlevleri soyutladığı çok katmanlı bir prensip üzerine inşa edilmiştir. Uygulama katmanı uygulama verileriyle çalışır, taşıma katmanı güvenilirliği sağlar, ağ katmanı yönlendirmeyi yönetir ve bağlantı katmanı fiziksel iletimi yönetir. Modülerlik komşu katmanları etkilemeden bir katman içindeki protokollerin değiştirilmesine olanak tanır.
Mobil geliştirmede, TCP/IP ağ istekleri yapan her uygulama tarafından kullanılır. URLSession, OkHttp, AFNetworking ve Alamofire gibi kütüphaneler bu yığın üzerinde çalışır ve paket paketleme ve yönlendirme ayrıntılarını geliştiriciden gizler. Ancak, performans optimizasyonu için TCP/IP'yi anlamak gerekir: URLSessionConfiguration aracılığıyla TCP parametrelerini yapılandırmak, zaman aşımlarını yönetmeye, HTTP Kalıcı Bağlantılarını sürdürmeye ve kurumsal ortamlar için proxy ayarlamaya olanak tanır.
Ağ sorunlarını teşhis etmek için TCP/IP'yi anlamak önemlidir: bir uygulama sunucuya bağlanamıyorsa, sorun yığının herhangi bir katmanında olabilir — fiziksel kanaldan uygulama protokolüne kadar. tcpdump, Wireshark ve Charles Proxy gibi araçlar, her katmandaki trafiği analiz etmeye ve darboğazları bulmaya olanak tanır. Mobil geliştiriciler için Xcode, Network Debug Dashboard sağlar ve Android Studio, gerçek zamanlı olarak TCP bağlantılarını analiz etmek için Network Inspector sunar.
TCP/IP modeli, her biri veri iletimi sırasında kesin olarak tanımlanmış işlevleri yerine getiren dört katman içerir. Bu hiyerarşiyi anlamak, ağ sorunlarını teşhis etmek ve uygulamaları optimize etmek için gereklidir.
Uygulama katmanında, uygulamaların doğrudan etkileşime girdiği protokoller çalışır: HTTP, HTTPS, FTP, SMTP, DNS, WebSocket. Bu katman, verileri uygulamanın anlayabileceği bir şekilde biçimlendirir ve taşıma katmanına iletir. Mobil uygulama geliştiricileri, ağ kütüphaneleri aracılığıyla bu katmanda çalışır.
Taşıma katmanı, farklı cihazlardaki uygulamalar arasında veri iletimini sağlar. Ana protokoller TCP (onaylı güvenilir iletim) ve UDP'dir (garantisiz hızlı iletim). TCP verilere gönderici ve alıcı portlarını ekler, paket sıralamasını yönetir ve ağ tıkanıklığını kontrol eder.
Ağ katmanı, adreslemeyi (IPv4, IPv6) ve paket yönlendirmeyi tanımlayan IP protokolü tarafından uygulanır. Her paket, gönderici ve alıcı IP adreslerini içerir ve yol boyunca yönlendiriciler, yönlendirme tablolarına göre bir sonraki düğüm hakkında kararlar alır. IPv4, 32 bit adresler (yaklaşık 4,3 milyar) kullanırken, IPv6 128 bit adresler kullanır ve adres tükenme sorununu çözer.
Bağlantı katmanı, fiziksel iletim ortamıyla çalışır: Ethernet, Wi-Fi, Bluetooth. Bu katman, paketleri sinyallere dönüştürür ve geri dönüştürür, MAC adresleri aracılığıyla iletim ortamına erişimi yönetir ve çerçeve kontrol dizilerini (FCS) kullanarak fiziksel katman hatalarını tespit eder.
Bağlantı katmanında, yerel ağdaki cihazların IP adreslerini MAC adreslerine dönüştüren ARP (Adres Çözümleme Protokolü) ve VPN bağlantılarında ve mobil veri ağlarında kullanılan PPP (Noktadan Noktaya Protokol) gibi protokoller çalışır.
| Katman | Protokoller | Fonksiyon |
|---|---|---|
| Uygulama | HTTP, HTTPS, DNS, FTP, WebSocket | Uygulama verilerini biçimlendirme |
| Taşıma | TCP, UDP | Uygulamalar arası iletim, hata kontrolü |
| Ağ | IP, ICMP, ARP | Paket yönlendirme ve adresleme |
| Bağlantı | Ethernet, Wi-Fi, PPP | Fiziksel ortam üzerinden iletim |
TCP (Transmission Control Protocol), taşıma katmanının ana protokollerinden biridir. Uygulamalar arasında bir bayt akışının güvenilir, sıralı ve hata denetimli teslimatını sağlar. Verileri iletmeden önce TCP, üç yönlü el sıkışma yoluyla bir bağlantı kurar.
Üç yönlü el sıkışma (three-way handshake), istemcinin bir SYN paketi göndermesiyle başlar. Sunucu, alımı onaylayan bir SYN-ACK paketiyle yanıt verir. İstemci, ACK paketiyle el sıkışmayı tamamlar ve ardından veri iletimi başlar. Bu süreç, her iki tarafın da değişime hazır olduğunu ve sıra numaralarında senkronize olduğunu garanti eder.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('example.com', 80))
sock.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
response = sock.recv(4096)
print(response.decode())
sock.close()
Örnekte, connect çağrıldığında otomatik olarak üç yönlü el sıkışma gerçekleştiren SOCK_STREAM türünde bir TCP soketi oluşturulur. send yöntemi bir HTTP isteği iletir ve recv yanıtı alır. Tamamlandıktan sonra close, bağlantıyı düzgün bir şekilde kapatmak için bir FIN paketi gönderir.
İş parçacıkları aracılığıyla birden çok istemciyi kabul eden Python'da bir TCP sunucusu örneğini inceleyelim. Her bağlantı ayrı bir iş parçacığında işlenir ve ana döngüyü engellemeden aynı anda birden çok istemciye hizmet verilmesini sağlar.
import socket
import threading
def handle_client(conn, addr):
print(f'İstemci bağlandı: {addr}')
with conn:
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data.upper())
print(f'İstemci {addr} bağlantısı kesildi')
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 9090))
server.listen(5)
print('TCP sunucusu 9090 portunda başlatıldı')
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
TCP sunucusu her bağlantıyı ayrı bir iş parçacığında işler ve sonsuz bir döngüde accept çağrısı yapar. handle_client işlevi verileri alır, büyük harfe dönüştürür ve sendall aracılığıyla geri gönderir. recv döngüsü sona erdiğinde (istemci bağlantıyı kapattığında), iş parçacığı sona erer ve soket otomatik olarak kapanır. Mobil uygulamalarda, bu tür düşük seviyeli soket çalışması doğrudan kullanılmaz — mobil HTTP kütüphaneleri, bağlantıları iş parçacığı havuzları aracılığıyla yönetir ve TCP bağlantılarını otomatik olarak yeniden kullanır.
TCP ve UDP arasındaki seçim, ağ iletişimi tasarlarken en önemli kararlardan biridir. TCP ek gecikme pahasına teslimat, sıra ve veri bütünlüğünü garanti eder. UDP minimum gecikme ve daha düşük kanal yükü için güvenilirlikten ödün verir.
| Özellik | TCP | UDP |
|---|---|---|
| Bağlantı | Kurar (el sıkışma) | Kurmaz |
| Güvenilirlik | Teslimatı garanti eder | Garanti etmez |
| Paket sırası | Sıralar | Sıralamaz |
| Hız | Daha düşük | Daha yüksek |
| Kullanım | Web, e-posta, dosyalar | Akış, oyunlar, DNS |
Mobil uygulamalar için protokol seçimi senaryoya bağlıdır: REST API'leri ve veri yükleme TCP gerektirirken, görüntülü görüşmeler ve çevrimiçi oyunlar UDP hızından yararlanır. Bazı uygulamalar her iki protokolü birleştirir — kontrol için TCP ve medya akışı için UDP. UDP üzerinde çalışan ve HTTP/3'te kullanılan modern QUIC protokolü, her iki yaklaşımın avantajlarını birleştirir ve iOS ve Android'de URLSession aracılığıyla otomatik olarak desteklenir.
Hata işleme ve zaman aşımı ile Python'da bir TCP istemcisi örneğini inceleyelim. Bu yaklaşım, mobil uygulamalarda güvenilir sunucu bağlantısı için kullanılır.
import socket
import sys
def tcp_client(host, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)
sock.connect((host, port))
print(f'{host}:{port} adresine bağlandı')
return sock
except socket.error as err:
print(f'Bağlantı hatası: {err}')
sys.exit(1)
sock = tcp_client('api.example.com', 443)
sock.close()
tcp_client işlevi bir ana bilgisayar ve port alır, 10 saniyelik zaman aşımıyla bir soket oluşturur ve bağlantı kurmayı dener. Bağlantı hatası durumunda — örneğin, sunucu kullanılamıyor veya güvenlik duvarı engelliyor — sorun açıklamasıyla bir istisna fırlatılır. Mobil uygulamalarda, bağlantı zaman aşımı kritiktir: çok kısa, yavaş ağlarda yanlış hatalara yol açar; çok uzun, arayüz donmasına yol açar. Mobil ağlar için önerilen değer, URLSession yapılandırmasında timeoutIntervalForRequest için 10–15 saniye ve timeoutIntervalForResource için 30–60 saniyedir.
Sıkça sorulan sorular
IP yönlendirmeden sorumludur — ara düğümler üzerinden göndericiden alıcıya bir paket teslim etmek. TCP, güvenilir veri birleştirmeyi sağlar: sıralamayı kontrol eder, bütünlüğü doğrular ve kayıp paketlerin yeniden iletilmesini ister. Birlikte TCP/IP yığınını oluştururlar.
TCP/IP sabit bir port kullanmaz — port uygulama tarafından atanır. Standart portlar: 80 (HTTP), 443 (HTTPS), 22 (SSH), 25 (SMTP). Port 443, mobil uygulamalarda güvenli web trafiği için ana porttur.
TCP bağlantısı, üç yönlü el sıkışma (SYN, SYN-ACK, ACK) yoluyla kurulan iki uygulama arasındaki mantıksal bir kanaldır. Bağlantı, gönderici ve alıcının (IP adresi, port) çiftiyle tanımlanır. El sıkışma her iki tarafın da veri alışverişine hazır olduğunu garanti eder.
Evet, TCP/IP İnternet erişimi olmadan yerel ağlarda (LAN) çalışır. Cihazlar Wi-Fi Direct, Bluetooth PAN veya Ethernet aracılığıyla bağlanır ve yerel IP adreslerini kullanarak veri alışverişi yapar. Yerel TCP/IP IoT cihazlarında ve eşler arası uygulamalarda kullanılır.
TCP ek mekanizmalar nedeniyle daha yavaştır: iletimden önce üç yönlü el sıkışma, her paketin onaylanması, kayıp segmentlerin yeniden iletilmesi ve tıkanıklık kontrolü. UDP bu kontroller olmadan verigramlar gönderir ve olası kayıplar pahasına gecikmeyi azaltır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun