Ethernet

  • 컴퓨터 네트워크 기술의 하나로, 물리 계층와 데이터 링크 계층으로 나뉜다.
  • 물리 계층           =>  신호와 배선 정의
    데이터링크 계층   =>  MAC 패킷과 프로토콜의 형식 정의 

Ethernet 헤더 구조

Destination MAC( 6 bytes ) Source MAC ( 6 bytes ) Type ( 2 bytes )
목적지 주소     출발지 주소    상위 계층 Protocol 종류 구분
( IP : 0x0800, ARP : 0x0806 등 ) 

                                      

IP ( Internet Protocol )

  • 컴퓨터가 갖게 되는 주소
  • Wifi가 달라질 때마다 얻는 주소가 달라진다.
  • 비신뢰성, 비연결성 통신이다.
    비신뢰성 => 흐름에 관여하지 않기 때문에 보낸 정보가 제대로 갔는지 보장 X
                  ex) 전송 과정에서 패킷이 손상되거나, 전송한 패킷의 순서가 뒤죽박죽이거나, 같은 패킷이
                         두 번 전송될 수도 있다.
  • 신뢰성을 보장하기 위해선 IP의 상위 프로토콜인 TCP를 사용해야 한다.
                  

IP 헤더 구조

Version : IP의 버전을 나타냄 ( IPv4 / IPv6 )

 

IHL      : IP헤더의 길이

 

TOS     : 서비스의 우선 순위를 제공

 

Total Length : ethernet패킷과 패킷 끝에 필요없는 부분을 제외한 순수 IP 패킷의 길이

 

Identification : 분열이 발생했을 때 원래의 데이터를 식별하기 위해서 사용  

 

Fragment Flags ( IP Flags )
     - x : 항상 0으로 설정
     - D : 분열 여부를 나타냄 ( 0 => 분열 가능, 1 => 분열 방지 )
     - M : 분열될 조각이 더 있는지 판단 ( 0 => 마지막 조각, 1 => 분열될 조각 더 있음 )

 

Fragment Offset : 8바이트 offset으로 조각에 저장된 원래 데이터의 바이트 범위 나타냄


TTL : 데이터를 전달할 수 없는 것으로 판단되어 소멸되기 이전에 데이터가 이동할 수 있는 단계의 수


Protocol : 상위계층 프로토콜 표시 ( TCP : 6, UDP : 17 )

 

Header Checksum : IP header의 체크섬을 저장

 

Source Address : 출발지 IP 주소

 

Destination Address : 목적지 IP 주소

 

TCP

  • 데이터를 송수신하기 위해 IP를 사용하는 프로토콜
  • 데이터를 세그먼트 단위로 잘게 쪼개서 전송한 후 데이터를 받은 도착지에서
    다시 재조립하는 과정을 거친다.

 

TCP 헤더 구조

Source Port : 데이터를 전송하는 곳의 포트번호

 

Destination Port : 목적지의 포트번호 ( 80 : HTTP, 443 : HTTPS )

 

Sequence Number : 데이터 byte의 고유한 일련번호. 이를 이용하여 순서를 올바르게 배열한다.

 

Acknowldegement Number
      - 다음 세그먼트 수신 준비가 되었다는 여부와 수신이 완료되었다는 확인 메시지 전달

 

Offset ( = Header Length )
      - 필드값 * 4 = TCP Header 길이

 

Reserved : 차후 사용을 위한 예약 필드

 

TCP Flags
  - TCP flag는 비트로 되어 있기 때문에 flag를 체크해 줄 때 비트 연산자를 써야 한다.
    ex) if(tcphdr->th_flags & TH_RST ) 이런 식으로 비트연산자(&,|,^ 등등) 을 써서 확인해야 한다.


  SYN : 연결 요청 플래그 ( 통신 시작시 세션을 연결하기 위한 플래그 )


  ACK : 응답 플래그 ( 송신측으로부터 패킷을 잘 받았다는 걸 알려주기 위한 플래그 )


  FIN  : 연결 종료 플래그 ( 세션 종료 )


  RST  : 연결 재설정 플래그 ( 강제 연결 종료 )


  PSH : 넣기 플래그 ( 버퍼가 채워지기를 기다리지 않고 받는 즉시 전달 )
          -> 버퍼링 없이 7계층의 응용프로그램에게 바로 전달한다.


  URG : 긴급 데이터 플래그   

 

Window Size : 송신 시스템의 수신 버퍼의 크기를 바이트 단위로 나타냄

 

Checksum : TCP 세그먼트 내용이 유효한지 확인 및 손상 여부 검사

 

 

※ 데이터 수신 측 (receiver) 이 필요한 정보 => window size, Acknowledgement Number

                                                                                        

'TCP, IP 네트워크 프로그래밍' 카테고리의 다른 글

TCP 통신  (0) 2022.02.03

TCP의 특징

1) Full duplex data transfer

           - 데이터 통신을 할 때 양방향으로 데이터가 흐른다.

 

2) Connection-oriented

           - 통신을 하기 앞서 Handshaking 과정을 통해 sender receiver의 상태를 확인한다.

 

3) Flow controlled

           - senderreceiver의 상태를 살펴보며 전송량을 조절한다.

 

4) Reliable, in-order byte stream

           - 데이터는 순서대로 application layer로 넘겨지며, 데이터를 byte로 처리하기 때문에

             application message의 맥락을 신경쓰지 않는다.

 

5) Pipelined

           - TCP congestion, flow controlpipeline을 위한 윈도우 사이즈를 결정한다.

 

 

TCP 입출력버퍼

  • TCP 소켓의 데이터 송수신에는 경계가 없다.
    아래와 같은 데이터의 처리를 하기 위해 tcp 통신에서는 입력 버퍼와 출력 버퍼가 필요하다.
    1. 송신측에서 write()로 여러 데이터를 몇 번에 걸쳐 보내도 수신 측에서는 read() 한 번으로 그 데이터들을
       한번에 수신한다.
    2. 송신측에서 용량이 큰 데이터를 write()로 보내도 수신 측에서는 read()로 데이터를 여러번 나누어 수신할 수 있다.


TCP 입출력 버퍼의 특징

  • 입출력버퍼는 tcp 소켓 각각에 별도로 존재한다.
  • 입출력버퍼는 소켓 생성시 자동으로 생성된다.
  • 소켓을 닫아도 출력버퍼에 남아 있는 데이터는 계속 전송된다.
  • 소켓을 닫으면 입력버퍼에 남아 있는 데이터는 소멸된다.
    -> 소켓을 닫았을 때 read()로 입력버퍼에 있는 값을 가져오려고 하면 read()는 -1을 반환한다.
  • 수신자가 데이터를 수신하는 시점 == 송신자가 write()를 호출했을 때가 아닌, 수신자가 read()를 호출했을 때!!

 

TCPpipelining

           - TCP는 패킷을 보낼 때 pipeline을 통해 전송한다.

            -> pipeline방식으로는 Go-Back-NSelective repeat 방식이 있는데,

                TCP는 두가지 방법을 혼합하여 사용한다.

            ( GBN방식처럼 중간에 패킷 하나가 빠지면 빠진 패킷에 대한 ack을 계속 전송하며,

              retransmission timer는 하나만 설정한다. 또한 selective repeat 방식처럼

              순서에 맞지 않게 온 패킷들도 버퍼에 다 보관해 놓는다. )

 

 

TCPsequence number

           - TCP에서 sequence numberapplication data의 양만큼 증가한다.

             ex) 하나의 패킷의 크기가 8bytes라면, sequence number1,9,17,25 …

                 이런 식으로 증가한다.

 

 

TCPack number

           - TCP에서 ACK번호 == “내가 너로부터 받기로 예상하는 sequence number

           - ACK번호를 받으면 바로 다음 턴에 ack에 해당하는 패킷을 보내줘야 한다.

 

TCP Header

           - UDP에 비해 굉장히 복잡한 형태를 가지고 있음.

 

             acknowledgement numberwindow size

                 => receiver가 필요한 정보를 실어 보내는 것

 

             나머지 부분

                 => sender가 필요한 정보를 실어 보내는 것

 

 

TCP round trip time ( RTT )

           - RTT : 특정 패킷을 전송하고 다시 응답을 받기까지 걸린 시간

           - TCP에서는 기본적으로 retransmission timer를 사용하므로, 예상 RTT를 계산하는 것

             이 매우 중요함!!

               

             retransmission timer < RTT 인 경우

                => 패킷이 유실되지도 않았는데 재전송하는 경우 발생

 

             retransmission timer > RTT 인 경우

                => 패킷이 유실되는 경우에 늦게 반응하는 속도 저하 발생

 

TCP fast retransmit

           TCP에서 패킷이 유실된 것을 의심해볼 수 있는 경우 2가지

           1. 중복된 ack이 계속해서 오는 경우        

           2. timeout이 발생한 경우

 

           -> 유실이 된 것으로 의심이 되면 빠르게 재전송을 해야 하는데 타이머의 timeout을 기

              다리는 것은 굉장히 답답하다. 한번에 여러 패킷을 보냈다고 하더라도 가장 첫 패킷

              에 대한 ack이 오고 나서야 다음 패킷에 대한 타이머가 시작되어 굉장히 느리다.

              

           위 문제점 해결 방법

                      - TCP fast retrasmit 방식 사용

                                 -> 재전송을 timeout에 의지하지 않고 중복된 ack메시지가 올 경우

                                      패킷이 유실된 것으로 추정하고 바로 재전송하는 방식

 

 

TCP Flow control

           - receiverbuffer 눈치를 보고 senderwindow size를 조절하는 것

           - TCP에서 flow controlreceiver측의 소켓에 존재하는 버퍼를 기준으로 삼는다.

 

       동작방식

           - 소켓의 버퍼에 데이터가 계속 쌓이면, application layer에서 데이터를 계속 가져간다.

             이 때 application layer에서 데이터를 가져가는 속도보다 버퍼에 데이터가 쌓이는 속도

             가 큰 경우 데이터가 유실될 수 있다

 

             => 이럴 경우 receiver측의 소켓 버퍼 상황을 고려하여 window size를 조절하는 것이

                 바로 TCP flow control이다.

             => flow controlsender가 조절하는게 아닌 receiversender에게 명령하는 것

                 ( 나 상황 이러니까 너가 보내는 속도 조절해라 sender~~^^ )

 

       TCP persist Timer

            - senderreceiver버퍼에 빈 공간이 있는지 알아보려고 주기적으로

              1byte짜리 메시지로 찔러보기 위한 타이머

      

 

결론

     1. pipelined된 패킷 통신을 할 때는 window가 존재하는데, TCP header에 수용 가능한

        window크기가 적혀있다.

    

     2. TCP flow controlreceiver의 소켓 버퍼가 수용 가능한지를 따져 sender가 전송량을

        조절하는 것이다.

     

    3. receiver의 소켓 버퍼가 가득 차있다가 여유가 생기면 sender에게 알려준다.

       동시에 senderreceiver에게 여유가 있는지 주기적으로 계속 찔러보는데

       이를 TCP persist Timer라고 한다.

'TCP, IP 네트워크 프로그래밍' 카테고리의 다른 글

TCP, IP, Ethernet 헤더  (0) 2022.02.18

+ Recent posts