패킷

Jan 30, 2024
패킷

1. 스위칭 (=데이터 전송 기술)

스위칭은 데이터를 송신자로부터 수신자로 전송하기 위해 네트워크 내에서 경로를 결정하고, 데이터를 작은 단위인 패킷(Packet)으로 분할하여 전송하는 과정을 말한다.
통신할 때, 데이터가 흘러 내려와서 모든 데이터는 패킷과 세그먼트로 바뀐다. (바뀌어야지만 재조립도 가능하고 목적지에 도착이 가능하기 때문)
자바에선 기본 버퍼가 8192바이트이니, 영문자는 8192개 들어감. 한글은 8192/3 버퍼니까 8192바이트 넘어가도 당연히.. 되지요
 

1.1 서킷 스위칭 > 안씀!

notion image
a라는 컴퓨터와 b라는 컴퓨터가 선 하나로 연결됨 : 전용선이 생긴것. 속도 짱 빠름! 그러나 이 방식은 통신하는 주체가 늘어나면 늘어날 수록 회선의 수도 증가하기 때문에 (전용선을 사용하는 모든 컴퓨터가 서로서로 연결 되어야 함!) 막대한 비용이 발생하고, 복잡성이 증가(그물망처럼..)하는 문제가 야기된다! 대규모 네트워크에서는 사용되지 않고, 주로 전화 통화와 같은 실시간 통신에 적합한 경우에 사용한다.
서킷 스위칭 못쓴다! 패킷 스위칭 쓴다 > 왜? 돈도 아끼고 웨이팅(지연시간)도 없애려고 TCP를 쓰면 데이터를 보내면 응답(ACK)이 온다, 그럼 내가 다시 한번 응답해줘야함 내가 만약 데이터를 전송했는데 ACK 안 보내면 한 번 더 재전송함.
 
 

[ 1-2. 패킷 스위칭 > 이걸 씀! ★ ]

패킷으로 쪼개서 전송

데이터를 작은 단위인 패킷(Packet)으로 분할하여 전송한다. 라우터(Router)가 중요한 역할을 수행하고 있으며, 인터넷과 같은 대규모 네트워크에서 주로 사용하는데 ...복잡하니 그림으로 알아보자
notion image
인접한 애들끼리 전용선을 라우터에 하나로 모은다. 그럼 이제부터 모든 데이터가 라우터로 간다는 말! 인접한 라우터들끼리 전용선을 하나로 모으면 데이터가 짧은 거리를 이동하게 된다. 이로 인해 선이 짧아지고, 데이터의 전송 속도와 신뢰성이 향상될 수 있다. 또한, 짧은 선으로 모든 통신을 처리할 수 있으므로 비용을 줄일 수 있다. * 라우터는 받은 데이터를 포워드하여 전송하는 역할
💡
포워드(Forward) - 받은 데이터를 목적지로 전송하는 동작 (농구 포지션처럼)
근데 이 방식은 누군가가 데이터를 한번에 큰 크기로 보내버리면 다른 애들이 기다려야 하는 문제가 발생한다. 그래서 1바이트 단위로 쪼개지 않고 더더더더 잘게 쪼개서 보내는 방식을 택함. 그게 바로 '세그먼트' 패킷은 바로 이 세그먼트를 감싼 개념으로, 세그먼트와 헤더가 결합된 형태로 전송되는 데이터의 단위이다.
 

세그먼트 설명

notion image
예시로, a/b/c/d 이런식으로 패킷을 더 잘게 쪼개는데 (실제로 이렇게 쪼개진 않음) 이렇게 잘린걸 '세그먼트' 라고 한다. 패킷은 세그먼트로 쪼개어 전송되는 것.
notion image
💡
A컴퓨터에서 받은 a, B컴퓨터에서 받은 a, C컴퓨터에서 받은 a가 라우터에 모임
데이터는 무조건 가장 가까운 라우터가 받음 그러나 이 데이터(세그먼트)만 가지고는 목적지를 알 수 없어서 목적지에 못 보낸다.
notion image
세그먼트로 나뉘는 순간 고유 번호가 생긴다. (os가 데이터를 받는 순간 세그먼트를 쪼개서 번호를 붙이는 것!) (1,2,3,4 -> 이 데이터의 순서를 뜻함. a가 1번, b가 2번, c가 3번인 셈) 이 번호는 데이터의 순서를 나타내며, 데이터의 도착 순서를 보장하기 위해 사용된다! -> 세그먼트에 고유 번호가 부여되었기에 데이터의 정확한 순서를 유지할 수 있음!
notion image
💡
헤더 데이터로 출발지/목적지 주소를 확인하고, 마지막에 재조립할 때, 세그먼트 고유번호로 순서를 확인, 순서에 맞게 영역에 정리
그러나 세그먼트만 가지고는 목적지에 도달할 수 없으니, 출발지, 목적지 주소 (주소 = 아이피 주소) 등의 정보가 포함된다. -> 목적지 주소를 붙이면서 내 주소도 같이 줘야한다. TCP니까 응답(ACK)도 같이 받아야하기 때문! -> 번호를 통해 세그먼트가 어떤 순서로 전송되어야 하는지 알 수 있으며, 도착지에서는 이 정보를 활용하여 세그먼트를 정확한 순서로 조립할 수 있다.
이렇게 목표 지점인 E근처에 있는 라우터를 거쳐서 E한테 들어감. 즉, E가 받은건 패킷 3개. 패킷을 전송하고 응답을 받는 과정에서 문제가 발생할 수도 있으니 패킷을 받으면 출발지 주소를 통해서 출발지에게 '나 잘 받았어!' 하고 응답 해줘야함 그래야만 출발지에서 "아! a가 잘 갔구나?" 라며 다음 데이터인 b를 보내준다. 하지만, 응답(ACK)을 받지 못하면 b는 전송되지 않는다. A를 또 전송해줌. 이는 응답을 받지 않았기 때문에 다음 동작을 수행할 수 없기 때문! 따라서, 패킷을 전송하고 응답을 기다리는 동안 응답을 받을 수 있도록 확인하는 것이 중요하다.
💡
헤더 데이터 : 파란색 박스. (출발지와 목적지 주소 등의 정보 포함) → 도착지 주소 : E / 출발지 주소 : A 바디 데이터 : 빨간색 박스. → PayLoad라고도 불린다. 패킷 = 세그먼트 + 헤더 (가 결합된 형태로 전송되는 데이터 단위)
 

조립 (마지막 단계)

notion image
라우터도 데이터 유실이 될 수 있다! 라우터가 용량 부족으로 인해 (4칸짜리 데이터를) 처리하지 못하거나, 라우터가 꺼져 있어서 데이터를 전달할 수 없는 경우 등 이런 경우엔 잘 받았다는 응답(ACK)이 도착하지 않았으니, 일반적으로 'b'를 전송하지 않고, 앞에서 전송한 데이터인 'a'를 재전송 한다. 따라서, 'a'가 여러 번 재전송되면 E측에서는 'a'가 중복으로 수신되어 4개가 되는 경우가 발생할 수도 있다! -> 재조립(데이터의 조합) 작업을 수행하여 데이터를 올바르게 복원해야 함! -> 이걸 위해서 패킷에 세그먼트 고유 번호를 써놨지!
notion image
E측에서 포장지(패킷)를 딱 벗기면 (제일 먼저 패킷을 벗기면 헤더와 바디가 나옴) 1. 출발 주소를 보고 A한테 a 잘 받았어^^ 하고 Acknowledge 보냄 2-1. 만약, A측에서 잘 받았다는 응답에 대한 응답을 안해주면? E는 받은 정보를 버려버림 -> 출발지에서 다시 처음부터 패킷을 보내줌 2-2. 응답의 응답까지 깔끔하게 잘 받았으면 -> 패킷의 역할은 끝 3. 2-2까지 잘 됐으면 이제 세그먼트를 확인할 차례 포장지(패킷)을 벗기면서 영역에 조립을 함 (영역 : os의 Buffer. 그래서 패킷 스트림?) 4. a영역, b영역, c역역 이렇게 조립이 완료되면 받은 데이터들은 삭제! (X표시)
💡
패킷이 라우터에 도착하면, 라우터는 목적지 주소를 확인하고 패킷을 적절한 포트 또는 인터페이스로 전달한다. 이 과정을 반복하여 패킷이 목적지에 도달하게 되는데. 이렇게 라우터를 통해 패킷이 전달되는 것을 패킷 스위칭이라고 한다.
💡
에크가 안 왔을 경우, 무한정 보내는 건 아니고, 3번 보내고 에크가 그래도 안오면 통신 중단! 에러!
 

라우터

라우터 - 출발지부터 목적지까지 최적 경로를 계산해줌 라우터 - 패킷 포워딩 (라우터가 수신한 패킷을 목적지로 전달하는 과정) (라우터... 전봇대에 달려있음. 우리나라는 kt lg sk 일케 달려있을 듯)
 
[ 라우터로 보는 헤더가 중요한 이유 ]
notion image
//만약, 라우터가 이런 상황이라면(거리가 같다면), 빠른 쪽으로 간다!
만약 a 데이터를 먼저 보냈는데, 라우터의 트래픽 때문에 a가 지체되고, b가 먼저 목적지에 도착 해 버렸다? (먼저 간 애가 먼저 들어올거란 보장x) -> 패킷과 세그먼트가 없으면 '뭐가 먼저야?' 의문에 빠져서 조립을 못한다! 그래서 헤더가 중요한 것!
notion image
💡
라우터는 패킷의 헤더 정보를 확인하면서 목적지 IP 주소를 기반으로 다음 목적지로 패킷을 전송한다. 세그먼트 고유번호는 라우터가 패킷을 전달하는 과정에서는 확인하지 않고, 마지막 조립할 때 확인한다.
 
[ 헤더도 데이터다 ]
헤더도 데이터다. 10번 쪼개지면 헤더도 10개. 데이터 용량을 1mb보낸다고 해서 딱 1mb가 보내지는게 아님. 즉, 헤더도 데이터기 때문에 용량을 가져서 1mb +a 로 용량이 늘어나는 것 보통 패킷은 1500byte가 최대. 1mb를 전송한다 치면, 순수 데이터는 1400byte정도가 들어간다는 말. * 세그먼트에도 헤더가 붙고, 패킷에도 헤더가 붙음. (둘은 다른 헤더)
 

프레임 (라우터로 가는 자동차)

프레임이란 '패킷의 주소를 보고 가장 가까운 라우터로 가는 자동차' 다. (패킷을 까지않는 이상 아이피주소를 모르기 때문에 프레임이 필요) 목적지와 출발지 IP를 들고 있는 패킷을 프레임으로 감싼다. > 이 프레임 안에 패킷이 있음 > 패킷 안에 세그먼트가 있는 상태 그럼 프레임의 목적지는? 제일 가까운 라우터!
만약, 라우터들의 거리가 똑같으면 바쁘지 않은 라우터를 찾아서 간다. 1. 프레임(으로 감싸인 패킷, 패킷으로 감싸인 세그먼트가) 라우터에 도착 2. 트럭(프레임)은 벗겨짐 3. 그 안에 있는 패킷 헤더(아이피 주소)를 보고 다음 목적지(다음 라우터)를 파악 4. 다시 트럭(프레임)에 태움(씌움) (프레임은 생겼다, 사라졌다, 생겼다, 사라졌다 함) 5. 라우터 도착 6. 프레임 벗겨짐 7. 패킷보고 목적지 확인 8. 프레임 씌움 9. 라우터 도착.. 이걸 최종 목적지(ex. E)에 도착할 때까지 반복함. : 프레임은 라우터가 쓰니까 프레임에는 다음 라우터의 주소 정보가 담겨 있다.
목적지에 도착 했을 때, 패킷을 보고 패킷 ACK를 함★ 안 그러면 발송지에서 또 보내니까 꼭! 잘 받았다고 패킷 에크를 해줘야함 그 이후 패킷을 벗김 > 세그먼트가 나옴 > 세그먼트 번호를 보고 재조립을 해서 데이터를 완성함 > 이 과정이 완료되면 파일소켓을 통해서 메일 프로그램에 데이터를 올림!! > 즉, readBuffer를 통해서 메일 프로그램으로 올라가는 것!
notion image

[ TCP IP 레이어 ]

데이터가 운영체제(OS)로 흘러들어오면 운영체제가 해당 데이터를 받는다. 그런 다음, 운영체제는 TCP/IP 프로토콜을 사용하여 데이터를 처리한다. OS에 데이터가 딱 내려왔을 때, TCP로 할 지, UDP로 할 지 정한다. 이후, TCP 레이어에서 데이터가 TCP 세그먼트로 쪼개지고, 그 다음 IP 레이어에서 패킷으로 바뀌게 되는 것! (패킷으로 바뀌면 목적지ㆍ출발지 주소가 생기기 때문에 IP 레이어라고 한다) 마지막으로 패킷은 하드웨어 레벨로 내려가게 되며, 가장 가까운 라우터로 전송하기 위해 프레임에 실려 나간다. 이후는 알지? 아니까 안 적음
 
 

[ 전체 구조도 ] - 왐마야

notion image
notion image
notion image
 
 
Share article

codingb